Executed on pinned 4c1f31af (ReleaseSafe/Darwin), Node v26.10.0, and system JavaScriptCore. These are existing language-semantic differences, separate from native enumeration transport/recovery.
A Proxy reporting { inherited: 2 } through getPrototypeOf over { own: 1 } yields [["own","inherited"],true] on Node/JSC, where the boolean records that the trap ran. zig-js yields [["own"],false].
var prototype = { inherited: 2 }, calls = 0;
var subject = new Proxy({ own: 1 }, {
getPrototypeOf() { calls++; return prototype; }
});
var keys = [];
for (var key in subject) keys.push(key);
JSON.stringify([keys, calls > 0]);A throwing has trap is not invoked by Node/JSC enumeration. zig-js invokes it and loses the own key:
var trace = [];
var subject = new Proxy({ own: 1 }, {
has() { trace.push("has"); throw "unexpected has"; },
getOwnPropertyDescriptor(target, key) {
trace.push("desc:" + key);
return Reflect.getOwnPropertyDescriptor(target, key);
}
});
var keys = [], thrown = null;
try { for (var key in subject) keys.push(key); } catch (error) { thrown = error; }
JSON.stringify([keys, trace, thrown]);Node/JSC: [["own"],["desc:own"],null]. zig-js: [[],["desc:own","has"],"unexpected has"].
ECMA-262 EnumerateObjectProperties requires prototype enumeration and obtains property attributes through [[GetOwnProperty]]. Proxy enumeration is exempt from matching the illustrative iterator algorithm exactly, so use observable results and both engine oracles rather than assuming identical implementation order.
Acceptance:
- Pin both executed witnesses in tree-walker, required-bytecode, optimizer-off/on, serialized/no-GIL controls.
- Honor reported prototypes and preserve shadowing, deletion, trap exceptions, and precise moving roots.
- Replace language-level
has-trap exception/GC witnesses with appropriate descriptor/prototype callbacks; retain exact callback/no-replay recovery coverage. - Measure exact-parent affected test262 path sets and run the unchanged thread/fuzz gates; no exclusions or relaxed budgets.