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, }, AllocateObject { implementation_name: Rc, destination_register: usize, }, InvokeStatic { function_name: Rc, source_code_location: SourceCodeLocation, }, InvokeObject { object_register: usize, function_name: Rc, source_code_location: SourceCodeLocation, }, InvokeStaticPlatform { function_name: Rc, source_code_location: SourceCodeLocation, }, InvokeObjectPlatform { object_register: usize, function_name: Rc, 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, }, Array { array_register: usize, index_register: usize, offset: isize, }, }