From e07bf2fbe9d5b479ac20021c3ca61cf9a91178b4 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 14 Aug 2026 22:01:03 +0800 Subject: [PATCH] =?UTF-8?q?test:=20full=5Freset=20=E5=90=8E=E8=B7=A8?= =?UTF-8?q?=E5=AE=B6=E6=97=8F=E6=96=B9=E6=B3=95=E8=B0=83=E7=94=A8=E5=9B=9E?= =?UTF-8?q?=E5=BD=92=E9=98=B2=E7=BA=BF=E8=A6=86=E7=9B=96=20call/apply/bind?= =?UTF-8?q?=20=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/vm_support.rs | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/crates/oxide_vm/src/vm_support.rs b/crates/oxide_vm/src/vm_support.rs index 21f7a22c..895f7327 100644 --- a/crates/oxide_vm/src/vm_support.rs +++ b/crates/oxide_vm/src/vm_support.rs @@ -633,8 +633,24 @@ mod tests { vm.full_reset(); - let result = run_source(&mut vm, "Array.prototype.push.call([1], 2)"); - assert_eq!(result, JsValue::int(2)); + // Function 原型家族重建后,未重建家族(array/string/object/map 等)的方法 + // wrapper 是跨重置存活对象,其原型链必须仍能解析出 call/apply/bind: + // 任何一条路径失效都说明 wrapper 原型指向了已释放的旧 Function 原型。 + assert_eq!(run_source(&mut vm, "Array.prototype.push.call([1], 2)"), JsValue::int(2)); + assert_eq!( + run_source(&mut vm, "Array.prototype.push.apply([], [1, 2, 3])"), + JsValue::int(3) + ); + let replaced = run_source(&mut vm, "String.prototype.replace.call('a', 'a', 'b')"); + assert_eq!(vm.lookup_str(replaced).as_deref(), Some("b")); + let has = run_source(&mut vm, "Object.prototype.hasOwnProperty.call({x: 1}, 'x')"); + assert_eq!(has, JsValue::bool(true)); + let fixed = run_source(&mut vm, "Number.prototype.toFixed.call(1.5, 1)"); + assert_eq!(vm.lookup_str(fixed).as_deref(), Some("1.5")); + let in_map = run_source(&mut vm, "Map.prototype.has.call(new Map([[1, 2]]), 1)"); + assert_eq!(in_map, JsValue::bool(true)); + let mapped = run_source(&mut vm, "Array.prototype.map.call([1, 2], function(x){ return x + 1; }).join(',')"); + assert_eq!(vm.lookup_str(mapped).as_deref(), Some("2,3")); assert!(!vm.session.is_dirty_since_snapshot()); }