diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index 6a9a67e..8918c7f 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -166,7 +166,7 @@ pub struct Vm { pub(crate) session_bytes_allocated: usize, pub object_prototype: P, pub math_rng_state: u64, - pub(crate) sub_modules: Vec, + pub(crate) sub_modules: Arc>, pub(crate) sub_module_constants: Vec>, pub(crate) saved_bytecode_stack: Vec>, pub(crate) saved_constants_stack: Vec>, diff --git a/crates/oxide_vm/src/vm_runtime.rs b/crates/oxide_vm/src/vm_runtime.rs index 01742e9..7af1cfc 100644 --- a/crates/oxide_vm/src/vm_runtime.rs +++ b/crates/oxide_vm/src/vm_runtime.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use oxide_bytecode::module::CompiledModule; use oxide_bytecode::opcode; @@ -30,7 +32,8 @@ impl Vm { } self.native_call_depth += 1; - let sub = self.sub_modules[sub_idx].clone(); + let subs = Arc::clone(&self.sub_modules); + let sub = &subs[sub_idx]; let converted_constants = self.convert_constants(&sub.constants).map_err(String::from)?; let saved = Box::new(InlineSyncState { @@ -55,7 +58,7 @@ impl Vm { self.regs = [JsValue::undefined(); 256]; self.pc = 0; - self.bytecode = sub.bytecode; + self.bytecode = sub.bytecode.clone(); self.constants = converted_constants; self.active_reg_limit = sub.n_registers.max(1); self.root_reg_limit = self.active_reg_limit; @@ -140,7 +143,7 @@ impl Vm { pub fn run(&mut self, module: &CompiledModule) -> Result { self.clear_execution_state(); - self.sub_modules = module.sub_modules.clone(); + self.sub_modules = Arc::new(module.sub_modules.clone()); self.constants = self.convert_constants(&module.constants).map_err(String::from)?; self.sub_module_constants = vec![Vec::new(); self.sub_modules.len()]; self.bytecode = module.bytecode.clone(); diff --git a/crates/oxide_vm/src/vm_support.rs b/crates/oxide_vm/src/vm_support.rs index 64f8a72..dab0d4b 100644 --- a/crates/oxide_vm/src/vm_support.rs +++ b/crates/oxide_vm/src/vm_support.rs @@ -38,7 +38,7 @@ impl Vm { session_bytes_allocated: 0, object_prototype: obj_proto, math_rng_state: 0, - sub_modules: Vec::new(), + sub_modules: Arc::new(Vec::new()), sub_module_constants: Vec::new(), saved_bytecode_stack: Vec::new(), saved_constants_stack: Vec::new(), @@ -85,7 +85,7 @@ impl Vm { session_bytes_allocated: 0, object_prototype: obj_proto, math_rng_state: 0, - sub_modules: Vec::new(), + sub_modules: Arc::new(Vec::new()), sub_module_constants: Vec::new(), saved_bytecode_stack: Vec::new(), saved_constants_stack: Vec::new(),