Преглед изворни кода

LibJS: Move BindingPattern bytecode generation into a method

Preparation for upcoming function where binding pattern will have to be
used outside of ASTCodegen.cpp
Aliaksandr Kalenik пре 1 година
родитељ
комит
00018ad415
2 измењених фајлова са 14 додато и 14 уклоњено
  1. 3 0
      Userland/Libraries/LibJS/AST.h
  2. 11 14
      Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp

+ 3 - 0
Userland/Libraries/LibJS/AST.h

@@ -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 };
 };
 };

+ 11 - 14
Userland/Libraries/LibJS/Bytecode/ASTCodegen.cpp

@@ -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)
-        return generate_object_binding_pattern_bytecode(generator, pattern, initialization_mode, input_value, create_variables);
+    if (kind == Kind::Object)
+        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));