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:
parent
793e1bf28a
commit
c194afd17c
2 changed files with 10 additions and 9 deletions
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) => {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue