From f1362f86e587fb9bb89575201af41046ee671805 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=E7=89=B9=E6=AF=8F=E7=BE=8A=E9=98=9F?= Date: Fri, 7 Aug 2026 00:38:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(vm):=20new=20=E6=9E=84=E9=80=A0=E5=85=A5?= =?UTF-8?q?=E5=8F=A3=E8=A1=A5=E9=BD=90=20sub=5Fmodules=20=E4=B8=8A?= =?UTF-8?q?=E4=B8=8B=E6=96=87=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/vm_dispatch_misc.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/crates/oxide_vm/src/vm_dispatch_misc.rs b/crates/oxide_vm/src/vm_dispatch_misc.rs index b0310d2..abccbe8 100644 --- a/crates/oxide_vm/src/vm_dispatch_misc.rs +++ b/crates/oxide_vm/src/vm_dispatch_misc.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::sync::{Arc, OnceLock}; use crate::native::NativeFn; use crate::vm::{native_fn_ptr_to_fn, CallFrame, ForInIter, FrameContinuation, Vm, MAX_PROTO_CHAIN_DEPTH}; @@ -153,6 +153,16 @@ impl Vm { } } + let callee_subs = &subs[sub_idx].sub_modules; + if callee_subs.is_empty() { + self.sub_module_stack.push((Arc::clone(&self.sub_modules), None)); + } else { + self.sub_module_stack + .push((Arc::clone(&self.sub_modules), Some(std::mem::take(&mut self.immutables_cache)))); + self.sub_modules = Arc::new(callee_subs.clone()); + self.immutables_cache = (0..=callee_subs.len()).map(|_| OnceLock::new()).collect(); + } + self.active_reg_limit = sub_n_registers.max(1); self.pc = 0; Ok(true)