ladybird/Libraries/LibJS/Tests/builtins/Proxy/for-in-iteration-traps.js
Andreas Kling 357eeba49c LibJS: Reduce number of proxy traps called during for..in iteration
Before this change, we would enumerate all the keys with
[[OwnPropertyKeys]], and then do [[GetOwnPropertyDescriptor]] twice for
each key as we went through them.

We now only do one [[GetOwnPropertyDescriptor]] per key, which
drastically reduces the number of proxy traps when those are involved.
The new trap sequence matches what you get with V8, so I don't think
anyone will be unpleasantly surprised here.
2025-03-20 17:50:02 -05:00

40 lines
1.1 KiB
JavaScript

test("for..in iteration Proxy traps", () => {
let traps = [];
let array = [1, 2, 3];
let from = new Proxy(array, {
getPrototypeOf: function (t) {
traps.push("getPrototypeOf");
return Reflect.getPrototypeOf(t);
},
ownKeys: function (t) {
traps.push("ownKeys");
return Reflect.ownKeys(t);
},
has: function (t, p) {
traps.push("has");
return Reflect.has(t, p);
},
getOwnPropertyDescriptor: function (t, p) {
traps.push("getOwnPropertyDescriptor");
return Reflect.getOwnPropertyDescriptor(t, p);
},
});
const to = [];
for (const prop in from) {
to.push(prop);
from.pop();
}
expect(to).toEqual(["0", "1"]);
expect(traps).toEqual([
"ownKeys",
"getPrototypeOf",
"getOwnPropertyDescriptor",
"getOwnPropertyDescriptor",
"getOwnPropertyDescriptor",
"getOwnPropertyDescriptor",
"getOwnPropertyDescriptor",
"getOwnPropertyDescriptor",
]);
});