1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 14:47:44 +00:00

LibJS: Fix runaway let scope when parsing for-in/of statements

This requires variables that should be exported to the script host
or to other scripts to be declared as var (such as in test-common.js),
since lexically-scoped variables won't be visible.
This commit is contained in:
Hendi 2021-07-05 21:31:51 +02:00 committed by Linus Groh
parent 793e1bf28a
commit c194afd17c
2 changed files with 10 additions and 9 deletions

View file

@ -2033,6 +2033,11 @@ NonnullRefPtr<Statement> Parser::parse_for_statement()
consume(TokenType::ParenOpen); consume(TokenType::ParenOpen);
bool in_scope = false; bool in_scope = false;
ScopeGuard guard([&]() {
if (in_scope)
m_state.let_scopes.take_last();
});
RefPtr<ASTNode> init; RefPtr<ASTNode> init;
if (!match(TokenType::Semicolon)) { if (!match(TokenType::Semicolon)) {
if (match_expression()) { if (match_expression()) {
@ -2075,10 +2080,6 @@ NonnullRefPtr<Statement> Parser::parse_for_statement()
TemporaryChange continue_change(m_state.in_continue_context, true); TemporaryChange continue_change(m_state.in_continue_context, true);
auto body = parse_statement(); auto body = parse_statement();
if (in_scope) {
m_state.let_scopes.take_last();
}
return create_ast_node<ForStatement>({ m_state.current_token.filename(), rule_start.position(), position() }, move(init), move(test), move(update), move(body)); return create_ast_node<ForStatement>({ m_state.current_token.filename(), rule_start.position(), position() }, move(init), move(test), move(update), move(body));
} }

View file

@ -1,10 +1,10 @@
let describe; var describe;
let test; var test;
let expect; var expect;
// Stores the results of each test and suite. Has a terrible // Stores the results of each test and suite. Has a terrible
// name to avoid name collision. // name to avoid name collision.
let __TestResults__ = {}; var __TestResults__ = {};
// So test names like "toString" don't automatically produce an error // So test names like "toString" don't automatically produce an error
Object.setPrototypeOf(__TestResults__, null); Object.setPrototypeOf(__TestResults__, null);
@ -12,7 +12,7 @@ Object.setPrototypeOf(__TestResults__, null);
// This array is used to communicate with the C++ program. It treats // This array is used to communicate with the C++ program. It treats
// each message in this array as a separate message. Has a terrible // each message in this array as a separate message. Has a terrible
// name to avoid name collision. // name to avoid name collision.
let __UserOutput__ = []; var __UserOutput__ = [];
// We also rebind console.log here to use the array above // We also rebind console.log here to use the array above
console.log = (...args) => { console.log = (...args) => {