LibJS: Emit ThrowIfTDZ for identifiers used in assignment expressions
Some checks are pending
CI / Lagom (x86_64, Fuzzers_CI, false, ubuntu-24.04, Linux, Clang) (push) Waiting to run
CI / Lagom (x86_64, Sanitizer_CI, false, ubuntu-24.04, Linux, GNU) (push) Waiting to run
CI / Lagom (arm64, Sanitizer_CI, false, macos-15, macOS, Clang) (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

Error about not-initialized `x` variable access should be thrown for:
```js
function foo() {
    x = 69;
    let x;
}

foo();
```

Progress on test262:
```
Diff Tests:
test/staging/sm/expressions/optional-chain-tdz.js  -> 
test/staging/sm/expressions/short-circuit-compound-assignment-tdz.js
 -> 
```

Fixes https://github.com/LadybirdBrowser/ladybird/issues/4587
This commit is contained in:
Aliaksandr Kalenik 2025-05-05 20:45:13 +03:00 committed by Andreas Kling
commit b3713db4ab
Notes: github-actions[bot] 2025-05-06 10:07:25 +00:00
2 changed files with 11 additions and 4 deletions

View file

@ -13,15 +13,15 @@
anim.cancel();
// "Undo" the removal of an animation by the Document
anim1 = foo.animate({ opacity: 0 }, { duration: 1, fill: 'forwards' });
anim2 = foo.animate({ opacity: 0 }, { duration: 1, fill: 'forwards' });
let anim1 = foo.animate({ opacity: 0 }, { duration: 1, fill: 'forwards' });
let anim2 = foo.animate({ opacity: 0 }, { duration: 1, fill: 'forwards' });
await anim1.finished;
anim1.persist();
println(`persist() undoes the Document removal effects: ${foo.getAnimations().length === 2}`);
const timeline = internals.createInternalAnimationTimeline();
let anim1 = foo.animate({ opacity: 0 }, { duration: 1000, fill: "forwards", timeline });
let anim2 = foo.animate({ opacity: 0 }, { duration: 500, fill: "forwards", timeline });
anim1 = foo.animate({ opacity: 0 }, { duration: 1000, fill: "forwards", timeline });
anim2 = foo.animate({ opacity: 0 }, { duration: 500, fill: "forwards", timeline });
timeline.setTime(1500);
await animationFrame();
if (anim1.replaceState === "removed" && anim2.replaceState === "active")