fix: 修复嵌套函数调用并接通闭包捕获链路

This commit is contained in:
爱特每羊队
2026-06-30 20:49:23 +08:00
parent 2d8e5d861d
commit 4271b7e348
7 changed files with 82 additions and 23 deletions
+5 -1
View File
@@ -60,6 +60,7 @@ impl Vm {
saved_bytecode_stack: std::mem::take(&mut self.saved_bytecode_stack),
saved_immutables_stack: std::mem::take(&mut self.saved_immutables_stack),
save_stack: std::mem::take(&mut self.save_stack),
cell_stack: std::mem::take(&mut self.cell_stack),
});
self.regs = [JsValue::undefined(); 256];
@@ -110,6 +111,7 @@ impl Vm {
self.saved_bytecode_stack = saved.saved_bytecode_stack;
self.saved_immutables_stack = saved.saved_immutables_stack;
self.save_stack = saved.save_stack;
self.cell_stack = saved.cell_stack;
result
}
@@ -126,6 +128,9 @@ impl Vm {
if let Some(saved_imm) = self.saved_immutables_stack.pop() {
self.active_immutables = saved_imm;
}
if let Some(saved_subs) = self.sub_module_stack.pop() {
self.sub_modules = saved_subs;
}
let offset = frame.saved_reg_offset as usize;
let len = frame.caller_reg_limit as usize;
self.regs[..len].copy_from_slice(&self.save_stack[offset..offset + len]);
@@ -148,7 +153,6 @@ impl Vm {
vm_debug!("run: starting bytecode execution, {} instructions", module.bytecode.len());
self.clear_execution_state();
self.sub_modules = Arc::new(module.sub_modules.clone());
// Per-run convert-once cache: slot 0 = top module, slot sub_idx+1 = sub_modules[sub_idx].
self.immutables_cache = (0..=self.sub_modules.len()).map(|_| OnceLock::new()).collect();
self.bytecode = module.bytecode.clone();
self.activate_immutables(0, &module.constants);