fix(vm): new 构造 cell_stack 失衡与子模块 immutables 缓存失步

This commit is contained in:
爱特每羊队
2026-08-07 00:15:09 +08:00
parent 328b8a3ddc
commit f57cb0f051
5 changed files with 20 additions and 6 deletions
+5 -2
View File
@@ -413,9 +413,12 @@ impl Vm {
} }
} }
self.sub_module_stack.push(Arc::clone(&self.sub_modules));
let callee_subs = &subs[sub_idx].sub_modules; let callee_subs = &subs[sub_idx].sub_modules;
if !callee_subs.is_empty() { 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.sub_modules = Arc::new(callee_subs.clone());
self.immutables_cache = (0..=callee_subs.len()).map(|_| OnceLock::new()).collect(); self.immutables_cache = (0..=callee_subs.len()).map(|_| OnceLock::new()).collect();
} }
+7 -3
View File
@@ -220,7 +220,7 @@ pub struct Vm {
pub(crate) iters: IterState, pub(crate) iters: IterState,
/// 分组保存 inline cache 与指令计数器。 /// 分组保存 inline cache 与指令计数器。
pub(crate) profiling: ProfilingState, pub(crate) profiling: ProfilingState,
pub(crate) sub_module_stack: Vec<Arc<Vec<CompiledModule>>>, pub(crate) sub_module_stack: Vec<(Arc<Vec<CompiledModule>>, Option<Vec<OnceLock<Vec<JsValue>>>>)>,
pub(crate) cell_stack: Vec<Vec<*mut Cell>>, pub(crate) cell_stack: Vec<Vec<*mut Cell>>,
pub(crate) temp_immutables: Vec<Vec<JsValue>>, pub(crate) temp_immutables: Vec<Vec<JsValue>>,
/// 可复用字符串缓冲区,避免每次 `+` 拼接都分配。 /// 可复用字符串缓冲区,避免每次 `+` 拼接都分配。
@@ -811,10 +811,14 @@ impl Vm {
} }
} }
self.sub_module_stack.push(Arc::clone(&self.sub_modules));
let callee_subs = &subs[sub_idx].sub_modules; let callee_subs = &subs[sub_idx].sub_modules;
if !callee_subs.is_empty() { 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.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.active_reg_limit = sub_n_registers.max(1);
+1
View File
@@ -143,6 +143,7 @@ impl Vm {
self.bytecode = sub_bytecode; self.bytecode = sub_bytecode;
let subs = Arc::clone(&self.sub_modules); let subs = Arc::clone(&self.sub_modules);
self.activate_immutables(sub_idx + 1, &subs[sub_idx].constants); self.activate_immutables(sub_idx + 1, &subs[sub_idx].constants);
self.cell_stack.push(Vec::with_capacity(subs[sub_idx].cells_needed as usize));
for (name, reg) in &self.sub_modules[sub_idx].builtin_reg_map { for (name, reg) in &self.sub_modules[sub_idx].builtin_reg_map {
let si = self.kernel_core.perm_interner().intern(name.as_str()).0; let si = self.kernel_core.perm_interner().intern(name.as_str()).0;
+6 -1
View File
@@ -130,8 +130,11 @@ impl Vm {
if let Some(saved_imm) = self.saved_immutables_stack.pop() { if let Some(saved_imm) = self.saved_immutables_stack.pop() {
self.active_immutables = saved_imm; self.active_immutables = saved_imm;
} }
if let Some(saved_subs) = self.sub_module_stack.pop() { if let Some((saved_subs, saved_cache)) = self.sub_module_stack.pop() {
self.sub_modules = saved_subs; self.sub_modules = saved_subs;
if let Some(saved_cache) = saved_cache {
self.immutables_cache = saved_cache;
}
} }
self.temp_immutables.pop(); self.temp_immutables.pop();
let offset = frame.saved_reg_offset as usize; let offset = frame.saved_reg_offset as usize;
@@ -189,6 +192,7 @@ impl Vm {
while let Some(handler) = self.try_stack.pop() { while let Some(handler) = self.try_stack.pop() {
while self.frames.len() > handler.frame_depth { while self.frames.len() > handler.frame_depth {
if let Some(frame) = self.frames.pop() { if let Some(frame) = self.frames.pop() {
self.cell_stack.pop();
self.restore_frame(frame); self.restore_frame(frame);
} }
} }
@@ -213,6 +217,7 @@ impl Vm {
} }
self.close_for_of_above(0); self.close_for_of_above(0);
while let Some(frame) = self.frames.pop() { while let Some(frame) = self.frames.pop() {
self.cell_stack.pop();
self.restore_frame(frame); self.restore_frame(frame);
} }
let exc = self.exception_value.take().unwrap_or(JsValue::undefined()); let exc = self.exception_value.take().unwrap_or(JsValue::undefined());
+1
View File
@@ -211,6 +211,7 @@ impl Vm {
self.regs = [JsValue::undefined(); 256]; self.regs = [JsValue::undefined(); 256];
self.pc = 0; self.pc = 0;
self.frames.clear(); self.frames.clear();
self.sub_module_stack.clear();
self.iters.reset(); self.iters.reset();
self.saved_bytecode_stack.clear(); self.saved_bytecode_stack.clear();
self.saved_immutables_stack.clear(); self.saved_immutables_stack.clear();