LibJS: Put newly instantiated functions into locals more efficiently

- Don't allocate a separate register, store directly into the local.
- Mark the local as initialized to avoid emitting TDZ checks.
This commit is contained in:
Andreas Kling 2025-03-27 14:44:04 +00:00 committed by Andreas Kling
parent 6c70dc5f09
commit 904beef6d2
Notes: github-actions[bot] 2025-03-27 19:51:28 +00:00

View file

@ -207,11 +207,14 @@ CodeGenerationErrorOr<void> Generator::emit_function_declaration_instantiation(E
}
for (auto const& declaration : function.m_functions_to_initialize) {
auto function = allocate_register();
emit<Op::NewFunction>(function, declaration, OptionalNone {});
if (declaration.name_identifier()->is_local()) {
emit<Op::Mov>(local(declaration.name_identifier()->local_variable_index()), function);
auto const& identifier = *declaration.name_identifier();
if (identifier.is_local()) {
auto local_index = identifier.local_variable_index();
emit<Op::NewFunction>(local(local_index), declaration, OptionalNone {});
set_local_initialized(local_index);
} else {
auto function = allocate_register();
emit<Op::NewFunction>(function, declaration, OptionalNone {});
emit<Op::SetVariableBinding>(intern_identifier(declaration.name()), function);
}
}