From b14ea8ff43d5477c245fb29b99184fd5f3ce3d66 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Sun, 27 Sep 2026 04:10:12 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=BF=94=E5=9B=9E=E6=B8=85=E7=A9=BA=20s?= =?UTF-8?q?loppy=20=E5=87=BD=E6=95=B0=20arguments=20=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=EF=BC=8C=E6=9C=AB=E6=AC=A1=20arguments=20=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E4=BF=9D=E6=B4=BB=E6=99=8B=E5=8D=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dispatch_create_arguments 把 sloppy 函数的 own arguments 数据属性设为本调用的 arguments 对象,调用返回后从不清除,强引用保活最后一次调用的 arguments 对象, 跨 epoch 晋升后泄漏(object_graph_retention_anchor 32770 vs 32769)。 restore_frame 弹帧时按 sloppy 且属性在场清空该属性(置 undefined),与 V8 对 非执行中函数 func.arguments 返回 undefined 的语义对齐;strict 函数无 own arguments,不涉及。 --- crates/oxide_vm/src/vm_runtime.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/crates/oxide_vm/src/vm_runtime.rs b/crates/oxide_vm/src/vm_runtime.rs index 4cf75499..2d37b995 100644 --- a/crates/oxide_vm/src/vm_runtime.rs +++ b/crates/oxide_vm/src/vm_runtime.rs @@ -533,6 +533,18 @@ impl Vm { frame.return_addr, frame.caller_reg_limit ); + // 调用返回:sloppy 函数在 dispatch_create_arguments 把 own arguments 属性 + // 设为本调用的 arguments 对象;返回后须清空(置 undefined),否则强引用 + // 保活最后一次调用的 arguments 对象,跨 epoch 晋升后泄漏。仅当属性在场时 + // 清空(strict 函数无 own arguments,避免误建)。 + if !frame.strict && frame.callee.is_object() { + let arguments_si = self.kernel_core.perm_interner().intern("arguments").0; + let callee_ref = unsafe { &*frame.callee.as_js_object_ptr() }; + if let Some(slot) = self.get_own_property_slot(callee_ref, arguments_si) { + let callee_mut = unsafe { &mut *frame.callee.as_js_object_ptr() }; + callee_mut.set_prop_at(slot, JsValue::undefined()); + } + } // 弹帧后 callee 换回调用方:失效 upvalue 切片缓存。 self.upvalue_cache = None; if let Some(saved_bc) = self.saved_bytecode_stack.pop() {