149 lines
2.9 KiB
Rust
149 lines
2.9 KiB
Rust
use crate::vm::constant::DvmConstant;
|
|
use crate::vm::source_code_location::SourceCodeLocation;
|
|
use std::rc::Rc;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub enum Instruction {
|
|
MoveImmediate {
|
|
destination_register: usize,
|
|
immediate: Immediate,
|
|
},
|
|
Copy {
|
|
source: Location,
|
|
destination: Location,
|
|
},
|
|
Push {
|
|
source_register: usize,
|
|
},
|
|
Pop {
|
|
destination_register: Option<usize>,
|
|
},
|
|
AllocateObject {
|
|
implementation_name: Rc<String>,
|
|
destination_register: usize,
|
|
},
|
|
InvokeStatic {
|
|
function_name: Rc<String>,
|
|
source_code_location: SourceCodeLocation,
|
|
},
|
|
InvokeObject {
|
|
object_register: usize,
|
|
function_name: Rc<String>,
|
|
source_code_location: SourceCodeLocation,
|
|
},
|
|
InvokeStaticPlatform {
|
|
function_name: Rc<String>,
|
|
source_code_location: SourceCodeLocation,
|
|
},
|
|
InvokeObjectPlatform {
|
|
object_register: usize,
|
|
function_name: Rc<String>,
|
|
source_code_location: SourceCodeLocation,
|
|
},
|
|
SetReturnValue {
|
|
source_register: usize,
|
|
},
|
|
TakeReturnValue {
|
|
destination_register: usize,
|
|
},
|
|
Add {
|
|
left: u8,
|
|
right: u8,
|
|
destination: u8,
|
|
},
|
|
Subtract {
|
|
left: u8,
|
|
right: u8,
|
|
destination: u8,
|
|
},
|
|
Multiply {
|
|
left: u8,
|
|
right: u8,
|
|
destination: u8,
|
|
},
|
|
Divide {
|
|
left: u8,
|
|
right: u8,
|
|
destination: u8,
|
|
},
|
|
Modulo {
|
|
left: u8,
|
|
right: u8,
|
|
destination: u8,
|
|
},
|
|
Power {
|
|
left: u8,
|
|
right: u8,
|
|
destination: u8,
|
|
},
|
|
Jump {
|
|
offset: isize,
|
|
},
|
|
JumpEqual {
|
|
left_register: usize,
|
|
right_register: usize,
|
|
offset: isize,
|
|
},
|
|
JumpNotEqual {
|
|
left_register: usize,
|
|
right_register: usize,
|
|
offset: isize,
|
|
},
|
|
JumpLessThan {
|
|
left_register: usize,
|
|
right_register: usize,
|
|
offset: isize,
|
|
},
|
|
JumpGreaterThan {
|
|
left_register: usize,
|
|
right_register: usize,
|
|
offset: isize,
|
|
},
|
|
JumpLessThanEqual {
|
|
left_register: usize,
|
|
right_register: usize,
|
|
offset: isize,
|
|
},
|
|
JumpGreaterThanEqual {
|
|
left_register: usize,
|
|
right_register: usize,
|
|
offset: isize,
|
|
},
|
|
Return,
|
|
DumpState {
|
|
message: String,
|
|
},
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub enum Immediate {
|
|
Byte(u8),
|
|
Int(i32),
|
|
Long(i64),
|
|
Double(f64),
|
|
Usize(usize),
|
|
Boolean(bool),
|
|
Constant(DvmConstant),
|
|
Empty,
|
|
}
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub enum Location {
|
|
Register(usize),
|
|
StackFrameBase {
|
|
offset: isize,
|
|
},
|
|
StackTop {
|
|
offset: isize,
|
|
},
|
|
Field {
|
|
object_register: usize,
|
|
field_name: Rc<String>,
|
|
},
|
|
Array {
|
|
array_register: usize,
|
|
index_register: usize,
|
|
offset: isize,
|
|
},
|
|
}
|