From d7bc6a9b4ec16beec6756cde9fd1e0a8b8b2cc24 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Wed, 24 Jun 2026 22:52:25 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=A8=A1=E5=9D=97=E6=A0=91=E6=94=B9?= =?UTF-8?q?=E7=94=A8=20Arc=20=E6=8C=81=E6=9C=89,=E6=B6=88=E9=99=A4?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E8=B0=83=E7=94=A8=E8=B7=AF=E5=BE=84=E6=B7=B1?= =?UTF-8?q?=E5=B1=82=E6=A8=A1=E5=9D=97=E5=85=8B=E9=9A=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/vm.rs | 2 +- crates/oxide_vm/src/vm_runtime.rs | 9 ++++++--- crates/oxide_vm/src/vm_support.rs | 4 ++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index 6a9a67e7..8918c7ff 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 01742e96..7af1cfcc 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 64f8a72a..dab0d4be 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(),