LibJS: Move BindingPattern bytecode generation into a method

Preparation for upcoming function where binding pattern will have to be
used outside of ASTCodegen.cpp
This commit is contained in:
Aliaksandr Kalenik 2024-05-09 05:00:07 +00:00 committed by Andreas Kling
commit 00018ad415
Notes: sideshowbarker 2024-07-16 21:51:02 +09:00
2 changed files with 14 additions and 14 deletions

View file

@ -18,6 +18,7 @@
#include <LibJS/Bytecode/CodeGenerationError.h> #include <LibJS/Bytecode/CodeGenerationError.h>
#include <LibJS/Bytecode/Executable.h> #include <LibJS/Bytecode/Executable.h>
#include <LibJS/Bytecode/IdentifierTable.h> #include <LibJS/Bytecode/IdentifierTable.h>
#include <LibJS/Bytecode/Op.h>
#include <LibJS/Bytecode/Operand.h> #include <LibJS/Bytecode/Operand.h>
#include <LibJS/Bytecode/ScopedOperand.h> #include <LibJS/Bytecode/ScopedOperand.h>
#include <LibJS/Forward.h> #include <LibJS/Forward.h>
@ -646,6 +647,8 @@ struct BindingPattern : RefCounted<BindingPattern> {
bool contains_expression() const; bool contains_expression() const;
Bytecode::CodeGenerationErrorOr<void> generate_bytecode(Bytecode::Generator&, Bytecode::Op::SetVariable::InitializationMode initialization_mode, Bytecode::ScopedOperand const& object, bool create_variables) const;
Vector<BindingEntry> entries; Vector<BindingEntry> entries;
Kind kind { Kind::Object }; Kind kind { Kind::Object };
}; };

View file

@ -459,8 +459,6 @@ Bytecode::CodeGenerationErrorOr<Optional<ScopedOperand>> SuperCall::generate_byt
return dst; return dst;
} }
static Bytecode::CodeGenerationErrorOr<void> generate_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::SetVariable::InitializationMode, ScopedOperand const& input_value, bool create_variables);
Bytecode::CodeGenerationErrorOr<Optional<ScopedOperand>> AssignmentExpression::generate_bytecode(Bytecode::Generator& generator, Optional<ScopedOperand> preferred_dst) const Bytecode::CodeGenerationErrorOr<Optional<ScopedOperand>> AssignmentExpression::generate_bytecode(Bytecode::Generator& generator, Optional<ScopedOperand> preferred_dst) const
{ {
Bytecode::Generator::SourceLocationScope scope(generator, *this); Bytecode::Generator::SourceLocationScope scope(generator, *this);
@ -588,7 +586,7 @@ Bytecode::CodeGenerationErrorOr<Optional<ScopedOperand>> AssignmentExpression::g
auto rval = TRY(m_rhs->generate_bytecode(generator)).value(); auto rval = TRY(m_rhs->generate_bytecode(generator)).value();
// 5. Perform ? DestructuringAssignmentEvaluation of assignmentPattern with argument rval. // 5. Perform ? DestructuringAssignmentEvaluation of assignmentPattern with argument rval.
TRY(generate_binding_pattern_bytecode(generator, pattern, Bytecode::Op::SetVariable::InitializationMode::Set, rval, false)); TRY(pattern->generate_bytecode(generator, Bytecode::Op::SetVariable::InitializationMode::Set, rval, false));
// 6. Return rval. // 6. Return rval.
return rval; return rval;
@ -1265,7 +1263,7 @@ static Bytecode::CodeGenerationErrorOr<void> generate_object_binding_pattern_byt
auto& binding_pattern = *alias.get<NonnullRefPtr<BindingPattern const>>(); auto& binding_pattern = *alias.get<NonnullRefPtr<BindingPattern const>>();
auto nested_value = generator.allocate_register(); auto nested_value = generator.allocate_register();
generator.emit<Bytecode::Op::Mov>(nested_value, value); generator.emit<Bytecode::Op::Mov>(nested_value, value);
TRY(generate_binding_pattern_bytecode(generator, binding_pattern, initialization_mode, nested_value, create_variables)); TRY(binding_pattern.generate_bytecode(generator, initialization_mode, nested_value, create_variables));
} else if (alias.has<Empty>()) { } else if (alias.has<Empty>()) {
if (name.has<NonnullRefPtr<Expression const>>()) { if (name.has<NonnullRefPtr<Expression const>>()) {
// This needs some sort of SetVariableByValue opcode, as it's a runtime binding // This needs some sort of SetVariableByValue opcode, as it's a runtime binding
@ -1336,7 +1334,7 @@ static Bytecode::CodeGenerationErrorOr<void> generate_array_binding_pattern_byte
return {}; return {};
}, },
[&](NonnullRefPtr<BindingPattern const> const& pattern) -> Bytecode::CodeGenerationErrorOr<void> { [&](NonnullRefPtr<BindingPattern const> const& pattern) -> Bytecode::CodeGenerationErrorOr<void> {
return generate_binding_pattern_bytecode(generator, pattern, initialization_mode, value, create_variables); return pattern->generate_bytecode(generator, initialization_mode, value, create_variables);
}, },
[&](NonnullRefPtr<MemberExpression const> const& expr) -> Bytecode::CodeGenerationErrorOr<void> { [&](NonnullRefPtr<MemberExpression const> const& expr) -> Bytecode::CodeGenerationErrorOr<void> {
(void)generator.emit_store_to_reference(*expr, value); (void)generator.emit_store_to_reference(*expr, value);
@ -1469,12 +1467,12 @@ static Bytecode::CodeGenerationErrorOr<void> generate_array_binding_pattern_byte
return {}; return {};
} }
static Bytecode::CodeGenerationErrorOr<void> generate_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::SetVariable::InitializationMode initialization_mode, ScopedOperand const& input_value, bool create_variables) Bytecode::CodeGenerationErrorOr<void> BindingPattern::generate_bytecode(Bytecode::Generator& generator, Bytecode::Op::SetVariable::InitializationMode initialization_mode, ScopedOperand const& input_value, bool create_variables) const
{ {
if (pattern.kind == BindingPattern::Kind::Object) if (kind == Kind::Object)
return generate_object_binding_pattern_bytecode(generator, pattern, initialization_mode, input_value, create_variables); return generate_object_binding_pattern_bytecode(generator, *this, initialization_mode, input_value, create_variables);
return generate_array_binding_pattern_bytecode(generator, pattern, initialization_mode, input_value, create_variables); return generate_array_binding_pattern_bytecode(generator, *this, initialization_mode, input_value, create_variables);
} }
static Bytecode::CodeGenerationErrorOr<void> assign_value_to_variable_declarator(Bytecode::Generator& generator, VariableDeclarator const& declarator, VariableDeclaration const& declaration, ScopedOperand value) static Bytecode::CodeGenerationErrorOr<void> assign_value_to_variable_declarator(Bytecode::Generator& generator, VariableDeclarator const& declarator, VariableDeclaration const& declaration, ScopedOperand value)
@ -1487,7 +1485,7 @@ static Bytecode::CodeGenerationErrorOr<void> assign_value_to_variable_declarator
return {}; return {};
}, },
[&](NonnullRefPtr<BindingPattern const> const& pattern) -> Bytecode::CodeGenerationErrorOr<void> { [&](NonnullRefPtr<BindingPattern const> const& pattern) -> Bytecode::CodeGenerationErrorOr<void> {
return generate_binding_pattern_bytecode(generator, pattern, initialization_mode, value, false); return pattern->generate_bytecode(generator, initialization_mode, value, false);
}); });
} }
@ -2563,7 +2561,7 @@ Bytecode::CodeGenerationErrorOr<Optional<ScopedOperand>> TryStatement::generate_
[&](NonnullRefPtr<BindingPattern const> const& binding_pattern) -> Bytecode::CodeGenerationErrorOr<void> { [&](NonnullRefPtr<BindingPattern const> const& binding_pattern) -> Bytecode::CodeGenerationErrorOr<void> {
generator.begin_variable_scope(); generator.begin_variable_scope();
did_create_variable_scope_for_catch_clause = true; did_create_variable_scope_for_catch_clause = true;
TRY(generate_binding_pattern_bytecode(generator, *binding_pattern, Bytecode::Op::SetVariable::InitializationMode::Initialize, caught_value, true)); TRY(binding_pattern->generate_bytecode(generator, Bytecode::Op::SetVariable::InitializationMode::Initialize, caught_value, true));
return {}; return {};
})); }));
@ -3076,7 +3074,7 @@ static Bytecode::CodeGenerationErrorOr<Optional<ScopedOperand>> for_in_of_body_e
TRY(generator.emit_store_to_reference(**ptr, next_value)); TRY(generator.emit_store_to_reference(**ptr, next_value));
} else { } else {
auto& binding_pattern = lhs.get<NonnullRefPtr<BindingPattern const>>(); auto& binding_pattern = lhs.get<NonnullRefPtr<BindingPattern const>>();
TRY(generate_binding_pattern_bytecode(generator, *binding_pattern, Bytecode::Op::SetVariable::InitializationMode::Set, next_value, false)); TRY(binding_pattern->generate_bytecode(generator, Bytecode::Op::SetVariable::InitializationMode::Set, next_value, false));
} }
} }
} }
@ -3161,9 +3159,8 @@ static Bytecode::CodeGenerationErrorOr<Optional<ScopedOperand>> for_in_of_body_e
auto& declaration = static_cast<VariableDeclaration const&>(*lhs.get<NonnullRefPtr<ASTNode const>>()); auto& declaration = static_cast<VariableDeclaration const&>(*lhs.get<NonnullRefPtr<ASTNode const>>());
VERIFY(declaration.declarations().size() == 1); VERIFY(declaration.declarations().size() == 1);
auto& binding_pattern = declaration.declarations().first()->target().get<NonnullRefPtr<BindingPattern const>>(); auto& binding_pattern = declaration.declarations().first()->target().get<NonnullRefPtr<BindingPattern const>>();
(void)TRY(generate_binding_pattern_bytecode( (void)TRY(binding_pattern->generate_bytecode(
generator, generator,
*binding_pattern,
head_result.lhs_kind == LHSKind::VarBinding ? Bytecode::Op::SetVariable::InitializationMode::Set : Bytecode::Op::SetVariable::InitializationMode::Initialize, head_result.lhs_kind == LHSKind::VarBinding ? Bytecode::Op::SetVariable::InitializationMode::Set : Bytecode::Op::SetVariable::InitializationMode::Initialize,
next_value, next_value,
false)); false));