Surfaced while landing #4595 (JSON.parse reviver). General object-model gap, not reviver-specific.
A plain object's [[Get]] does not walk to Object.prototype for properties assigned there at runtime. Minimal repro:
(Object.prototype as any).foo = 99;
const o: any = { foo: 1 };
delete o.foo;
console.log(o.foo); // Node: 99 (inherited) Perry: 1 / undefined
Node prints 99; Perry returns the stale own value (or undefined after delete) — the inherited Object.prototype.foo is never consulted.
Failing test262 (built-ins/JSON/parse/), which rely on re-reading an inherited value after the reviver deletes the own property:
reviver-object-get-prop-from-prototype
reviver-array-get-prop-from-prototype
The reviver walk now correctly does a real [[Get]] re-read per #4595; it's [[Get]]'s prototype-chain traversal for assigned Object.prototype members that's missing.
Surfaced while landing #4595 (JSON.parse reviver). General object-model gap, not reviver-specific.
A plain object's
[[Get]]does not walk toObject.prototypefor properties assigned there at runtime. Minimal repro:Node prints
99; Perry returns the stale own value (orundefinedafter delete) — the inheritedObject.prototype.foois never consulted.Failing test262 (
built-ins/JSON/parse/), which rely on re-reading an inherited value after the reviver deletes the own property:reviver-object-get-prop-from-prototypereviver-array-get-prop-from-prototypeThe reviver walk now correctly does a real
[[Get]]re-read per #4595; it's[[Get]]'s prototype-chain traversal for assignedObject.prototypemembers that's missing.