diff --git a/src/main.rs b/src/main.rs index d2fe5a5..c2b84f1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -69,10 +69,11 @@ fn main() { environment: Default::default(), constants, prototypes: Default::default(), + proto_counter: 0, }; - vm.prototypes.insert(0, instructions); - for (i, prototype) in state.prototypes.into_iter().enumerate() { - vm.prototypes.insert((i + 1) as u32, prototype); + let chunk_id = vm.new_prototype(instructions); + for prototype in state.prototypes { + vm.new_prototype(prototype); } dbg!(&vm.prototypes); @@ -85,7 +86,7 @@ fn main() { vm::Value::RustFunction(Rc::new(RefCell::new(Print))), ); - let closure = vm.create_closure(0); + let closure = vm.create_closure(chunk_id); let mut run = closure.run(Vec::new()); diff --git a/src/vm.rs b/src/vm.rs index 2ebae85..f464393 100644 --- a/src/vm.rs +++ b/src/vm.rs @@ -253,6 +253,16 @@ pub struct VirtualMachine { pub environment: Rc>, pub constants: Vec, pub prototypes: HashMap>, + pub proto_counter: u32, +} + +impl VirtualMachine { + pub fn new_prototype(&mut self, instructions: Vec) -> u32 { + let proto_id = self.proto_counter; + self.proto_counter += 1; + self.prototypes.insert(proto_id, instructions); + proto_id + } } impl VirtualMachine {