LibJS: Emit ThrowIfTDZ for identifiers used in assignment expressions

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
parent db480b1f0c
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

@@ -630,6 +630,13 @@ Bytecode::CodeGenerationErrorOr<Optional<ScopedOperand>> AssignmentExpression::g
// e. Perform ? PutValue(lref, rval).
if (is<Identifier>(*lhs)) {
auto& identifier = static_cast<Identifier const&>(*lhs);
if (identifier.is_local()) {
auto is_initialized = generator.is_local_initialized(identifier.local_index());
auto is_lexically_declared = generator.is_local_lexically_declared(identifier.local_index());
if (is_lexically_declared && !is_initialized) {
generator.emit<Bytecode::Op::ThrowIfTDZ>(generator.local(identifier.local_index()));
}
}
generator.emit_set_variable(identifier, rval);
} else if (is<MemberExpression>(*lhs)) {
auto& expression = static_cast<MemberExpression const&>(*lhs);