From cf4e95456e805d6bd088d4a86f1ca7efeb43af1d Mon Sep 17 00:00:00 2001 From: Andrew Morris Date: Fri, 27 May 2022 12:46:48 +1000 Subject: [PATCH] Add unimplemented new instruction --- src/vstc/assemble.rs | 3 +++ src/vstc/virtual_machine/instruction.rs | 1 + src/vstc/virtual_machine/mod.rs | 1 + src/vstc/virtual_machine/virtual_machine.rs | 2 ++ src/vstc/virtual_machine/vs_class.rs | 11 +++++++++++ src/vstc/virtual_machine/vs_value.rs | 2 ++ 6 files changed, 20 insertions(+) create mode 100644 src/vstc/virtual_machine/vs_class.rs diff --git a/src/vstc/assemble.rs b/src/vstc/assemble.rs index 03f7abf..736cad2 100644 --- a/src/vstc/assemble.rs +++ b/src/vstc/assemble.rs @@ -217,6 +217,7 @@ impl<'a> Assembler<'a> { ("jmpif", Instruction::JmpIf), ("unary+", Instruction::UnaryPlus), ("unary-", Instruction::UnaryMinus), + ("new", Instruction::New), ]); for (word, instruction) in instruction_word_map { @@ -800,6 +801,7 @@ enum Instruction { JmpIf = 0x28, UnaryPlus = 0x29, UnaryMinus = 0x2a, + New = 0x2b, } enum InstructionArg { @@ -856,6 +858,7 @@ fn get_instruction_layout(instruction: Instruction) -> Vec { JmpIf => Vec::from([Value, Label]), UnaryPlus => Vec::from([Value, Register]), UnaryMinus => Vec::from([Value, Register]), + New => Vec::from([Value, Value, Register]), }; } diff --git a/src/vstc/virtual_machine/instruction.rs b/src/vstc/virtual_machine/instruction.rs index 9b63349..44c544c 100644 --- a/src/vstc/virtual_machine/instruction.rs +++ b/src/vstc/virtual_machine/instruction.rs @@ -46,6 +46,7 @@ pub enum Instruction { JmpIf = 0x28, UnaryPlus = 0x29, UnaryMinus = 0x2a, + New = 0x2b, } impl Instruction { diff --git a/src/vstc/virtual_machine/mod.rs b/src/vstc/virtual_machine/mod.rs index 2a25e61..4d4f0c5 100644 --- a/src/vstc/virtual_machine/mod.rs +++ b/src/vstc/virtual_machine/mod.rs @@ -10,5 +10,6 @@ mod vs_array; mod native_function; mod builtins; mod math; +mod vs_class; pub use virtual_machine::VirtualMachine; diff --git a/src/vstc/virtual_machine/virtual_machine.rs b/src/vstc/virtual_machine/virtual_machine.rs index 6c85798..6139131 100644 --- a/src/vstc/virtual_machine/virtual_machine.rs +++ b/src/vstc/virtual_machine/virtual_machine.rs @@ -371,6 +371,8 @@ impl VirtualMachine { UnaryPlus => frame.apply_unary_op(operations::op_unary_plus), UnaryMinus => frame.apply_unary_op(operations::op_unary_minus), + + New => std::panic!("Not implemented"), }; } diff --git a/src/vstc/virtual_machine/vs_class.rs b/src/vstc/virtual_machine/vs_class.rs new file mode 100644 index 0000000..bcf5078 --- /dev/null +++ b/src/vstc/virtual_machine/vs_class.rs @@ -0,0 +1,11 @@ +use std::rc::Rc; + +use super::vs_value::Val; +use super::vs_function::VsFunction; + +pub struct VsClass { + pub constructor: Rc, + pub instance_prototype: Val, +} + +impl VsClass {} diff --git a/src/vstc/virtual_machine/vs_value.rs b/src/vstc/virtual_machine/vs_value.rs index e378dd8..b7cf92b 100644 --- a/src/vstc/virtual_machine/vs_value.rs +++ b/src/vstc/virtual_machine/vs_value.rs @@ -5,6 +5,7 @@ use super::vs_function::VsFunction; use super::virtual_machine::StackFrame; use super::vs_object::VsObject; use super::vs_array::VsArray; +// use super::vs_class::VsClass; use super::operations::{op_sub, op_submov}; #[derive(Clone)] @@ -18,6 +19,7 @@ pub enum Val { Array(Rc), Object(Rc), Function(Rc), + // Class(Rc), Static(&'static dyn ValTrait), Custom(Rc), }