1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 13:37:45 +00:00

LibJS: Skip lexical declaration traversal in FDI if there are none

This commit is contained in:
Andreas Kling 2023-11-27 21:01:07 +01:00
parent 3b6785245f
commit aaa7b50f06

View file

@ -869,31 +869,33 @@ ThrowCompletionOr<void> ECMAScriptFunctionObject::function_declaration_instantia
// 33. Let lexDeclarations be the LexicallyScopedDeclarations of code. // 33. Let lexDeclarations be the LexicallyScopedDeclarations of code.
// 34. For each element d of lexDeclarations, do // 34. For each element d of lexDeclarations, do
// NOTE: Due to the use of MUST in the callback, an exception should not result from `for_each_lexically_scoped_declaration`. // NOTE: Due to the use of MUST in the callback, an exception should not result from `for_each_lexically_scoped_declaration`.
MUST(scope_body->for_each_lexically_scoped_declaration([&](Declaration const& declaration) { if (scope_body->has_lexical_declarations()) {
// NOTE: Due to the use of MUST with `create_immutable_binding` and `create_mutable_binding` below, MUST(scope_body->for_each_lexically_scoped_declaration([&](Declaration const& declaration) {
// an exception should not result from `for_each_bound_name`. // NOTE: Due to the use of MUST with `create_immutable_binding` and `create_mutable_binding` below,
// an exception should not result from `for_each_bound_name`.
// a. NOTE: A lexically declared name cannot be the same as a function/generator declaration, formal parameter, or a var name. Lexically declared names are only instantiated here but not initialized. // a. NOTE: A lexically declared name cannot be the same as a function/generator declaration, formal parameter, or a var name. Lexically declared names are only instantiated here but not initialized.
// b. For each element dn of the BoundNames of d, do // b. For each element dn of the BoundNames of d, do
MUST(declaration.for_each_bound_identifier([&](auto const& id) { MUST(declaration.for_each_bound_identifier([&](auto const& id) {
if (id.is_local()) { if (id.is_local()) {
// NOTE: Local variables are supported only in bytecode interpreter // NOTE: Local variables are supported only in bytecode interpreter
return; return;
} }
// i. If IsConstantDeclaration of d is true, then // i. If IsConstantDeclaration of d is true, then
if (declaration.is_constant_declaration()) { if (declaration.is_constant_declaration()) {
// 1. Perform ! lexEnv.CreateImmutableBinding(dn, true). // 1. Perform ! lexEnv.CreateImmutableBinding(dn, true).
MUST(lex_environment->create_immutable_binding(vm, id.string(), true)); MUST(lex_environment->create_immutable_binding(vm, id.string(), true));
} }
// ii. Else, // ii. Else,
else { else {
// 1. Perform ! lexEnv.CreateMutableBinding(dn, false). // 1. Perform ! lexEnv.CreateMutableBinding(dn, false).
MUST(lex_environment->create_mutable_binding(vm, id.string(), false)); MUST(lex_environment->create_mutable_binding(vm, id.string(), false));
} }
}));
})); }));
})); }
// 35. Let privateEnv be the PrivateEnvironment of calleeContext. // 35. Let privateEnv be the PrivateEnvironment of calleeContext.
auto private_environment = callee_context.private_environment; auto private_environment = callee_context.private_environment;