ladybird/Libraries/LibJS/Tests/redefine-next-in-builtin-iterators.js
Aliaksandr Kalenik f405d71657
Some checks are pending
CI / Lagom (x86_64, Fuzzers_CI, false, ubuntu-24.04, Linux, Clang) (push) Waiting to run
CI / Lagom (arm64, Sanitizer_CI, false, macos-15, macOS, Clang) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, false, ubuntu-24.04, Linux, GNU) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, true, ubuntu-24.04, Linux, Clang) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (arm64, macos-15, macOS, macOS-universal2) (push) Waiting to run
Package the js repl as a binary artifact / build-and-package (x86_64, ubuntu-24.04, Linux, Linux-x86_64) (push) Waiting to run
Run test262 and test-wasm / run_and_update_results (push) Waiting to run
Lint Code / lint (push) Waiting to run
Label PRs with merge conflicts / auto-labeler (push) Waiting to run
Push notes / build (push) Waiting to run
LibJS: Disable optimization in IteratorNextUnpack if next() is redefined
81b6a11 regressed correctness by always bypassing the `next()` method
resolution for built-in iterators, causing incorrect behavior when
`next()` was redefined on built-in prototypes. This change fixes the
issue by storing a flag on built-in prototypes indicating whether
`next()` has ever been redefined.
2025-05-12 07:41:29 -04:00

46 lines
1.5 KiB
JavaScript

describe("redefine next() in built in iterators", () => {
test("redefine next() in ArrayIteratorPrototype", () => {
let arrayIteratorPrototype = Object.getPrototypeOf([].values());
let originalNext = arrayIteratorPrototype.next;
let counter = 0;
arrayIteratorPrototype.next = function () {
counter++;
return originalNext.apply(this, arguments);
};
for (let i of [1, 2, 3]) {
}
expect(counter).toBe(4);
});
test("redefine next() in MapIteratorPrototype", () => {
let m = new Map([
[1, 1],
[2, 2],
[3, 3],
]);
let mapIteratorPrototype = Object.getPrototypeOf(m.values());
let originalNext = mapIteratorPrototype.next;
let counter = 0;
mapIteratorPrototype.next = function () {
counter++;
return originalNext.apply(this, arguments);
};
for (let v of m.values()) {
}
expect(counter).toBe(4);
});
test("redefine next() in SetIteratorPrototype", () => {
let s = new Set([1, 2, 3]);
let setIteratorPrototype = Object.getPrototypeOf(s.values());
let originalNext = setIteratorPrototype.next;
let counter = 0;
setIteratorPrototype.next = function () {
counter++;
return originalNext.apply(this, arguments);
};
for (let v of s.values()) {
}
expect(counter).toBe(4);
});
});