diff --git a/Libraries/LibJS/AST.h b/Libraries/LibJS/AST.h index 901033c65ee..5ff65ce8f28 100644 --- a/Libraries/LibJS/AST.h +++ b/Libraries/LibJS/AST.h @@ -659,7 +659,7 @@ struct BindingPattern : RefCounted { bool contains_expression() const; - Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&, Bytecode::Op::BindingInitializationMode initialization_mode, Bytecode::ScopedOperand const& object, bool create_variables) const; + Bytecode::CodeGenerationErrorOr generate_bytecode(Bytecode::Generator&, Bytecode::Op::BindingInitializationMode initialization_mode, Bytecode::ScopedOperand const& object) const; Vector entries; Kind kind { Kind::Object }; diff --git a/Libraries/LibJS/Bytecode/ASTCodegen.cpp b/Libraries/LibJS/Bytecode/ASTCodegen.cpp index e1939e2a748..7630a2ef4d3 100644 --- a/Libraries/LibJS/Bytecode/ASTCodegen.cpp +++ b/Libraries/LibJS/Bytecode/ASTCodegen.cpp @@ -662,7 +662,7 @@ Bytecode::CodeGenerationErrorOr> AssignmentExpression::g auto rval = TRY(m_rhs->generate_bytecode(generator)).value(); // 5. Perform ? DestructuringAssignmentEvaluation of assignmentPattern with argument rval. - TRY(pattern->generate_bytecode(generator, Bytecode::Op::BindingInitializationMode::Set, rval, false)); + TRY(pattern->generate_bytecode(generator, Bytecode::Op::BindingInitializationMode::Set, rval)); // 6. Return rval. return rval; @@ -1297,7 +1297,7 @@ Bytecode::CodeGenerationErrorOr> FunctionExpression::gen return generate_bytecode_with_lhs_name(generator, {}, preferred_dst); } -static Bytecode::CodeGenerationErrorOr generate_object_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::BindingInitializationMode initialization_mode, ScopedOperand const& object, bool create_variables) +static Bytecode::CodeGenerationErrorOr generate_object_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::BindingInitializationMode initialization_mode, ScopedOperand const& object) { generator.emit(object); @@ -1311,15 +1311,10 @@ static Bytecode::CodeGenerationErrorOr generate_object_binding_pattern_byt VERIFY(!initializer); if (name.has>()) { auto identifier = name.get>(); - auto interned_identifier = generator.intern_identifier(identifier->string()); auto copy = generator.allocate_register(); generator.emit_with_extra_operand_slots( excluded_property_names.size(), copy, object, excluded_property_names); - if (create_variables) { - VERIFY(!identifier->is_local()); - generator.emit(interned_identifier, Bytecode::Op::EnvironmentMode::Lexical, false); - } generator.emit_set_variable(*identifier, copy, initialization_mode); return {}; @@ -1381,7 +1376,7 @@ static Bytecode::CodeGenerationErrorOr generate_object_binding_pattern_byt if (alias.has>()) { auto& binding_pattern = *alias.get>(); auto nested_value = generator.copy_if_needed_to_preserve_evaluation_order(value); - TRY(binding_pattern.generate_bytecode(generator, initialization_mode, nested_value, create_variables)); + TRY(binding_pattern.generate_bytecode(generator, initialization_mode, nested_value)); } else if (alias.has()) { if (name.has>()) { // This needs some sort of SetVariableByValue opcode, as it's a runtime binding @@ -1392,24 +1387,18 @@ static Bytecode::CodeGenerationErrorOr generate_object_binding_pattern_byt } auto const& identifier = *name.get>(); - auto identifier_ref = generator.intern_identifier(identifier.string()); - if (create_variables) - generator.emit(identifier_ref, Bytecode::Op::EnvironmentMode::Lexical, false); generator.emit_set_variable(identifier, value, initialization_mode); } else if (alias.has>()) { TRY(generator.emit_store_to_reference(alias.get>(), value)); } else { auto const& identifier = *alias.get>(); - auto identifier_ref = generator.intern_identifier(identifier.string()); - if (create_variables) - generator.emit(identifier_ref, Bytecode::Op::EnvironmentMode::Lexical, false); generator.emit_set_variable(identifier, value, initialization_mode); } } return {}; } -static Bytecode::CodeGenerationErrorOr generate_array_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::BindingInitializationMode initialization_mode, ScopedOperand const& input_array, bool create_variables, [[maybe_unused]] Optional preferred_dst = {}) +static Bytecode::CodeGenerationErrorOr generate_array_binding_pattern_bytecode(Bytecode::Generator& generator, BindingPattern const& pattern, Bytecode::Op::BindingInitializationMode initialization_mode, ScopedOperand const& input_array, [[maybe_unused]] Optional preferred_dst = {}) { /* * Consider the following destructuring assignment: @@ -1445,14 +1434,11 @@ static Bytecode::CodeGenerationErrorOr generate_array_binding_pattern_byte return {}; }, [&](NonnullRefPtr const& identifier) -> Bytecode::CodeGenerationErrorOr { - auto interned_index = generator.intern_identifier(identifier->string()); - if (create_variables) - generator.emit(interned_index, Bytecode::Op::EnvironmentMode::Lexical, false); generator.emit_set_variable(*identifier, value, initialization_mode); return {}; }, [&](NonnullRefPtr const& pattern) -> Bytecode::CodeGenerationErrorOr { - return pattern->generate_bytecode(generator, initialization_mode, value, create_variables); + return pattern->generate_bytecode(generator, initialization_mode, value); }, [&](NonnullRefPtr const& expr) -> Bytecode::CodeGenerationErrorOr { (void)generator.emit_store_to_reference(*expr, value); @@ -1585,12 +1571,12 @@ static Bytecode::CodeGenerationErrorOr generate_array_binding_pattern_byte return {}; } -Bytecode::CodeGenerationErrorOr BindingPattern::generate_bytecode(Bytecode::Generator& generator, Bytecode::Op::BindingInitializationMode initialization_mode, ScopedOperand const& input_value, bool create_variables) const +Bytecode::CodeGenerationErrorOr BindingPattern::generate_bytecode(Bytecode::Generator& generator, Bytecode::Op::BindingInitializationMode initialization_mode, ScopedOperand const& input_value) const { if (kind == Kind::Object) - return generate_object_binding_pattern_bytecode(generator, *this, initialization_mode, input_value, create_variables); + return generate_object_binding_pattern_bytecode(generator, *this, initialization_mode, input_value); - return generate_array_binding_pattern_bytecode(generator, *this, initialization_mode, input_value, create_variables); + return generate_array_binding_pattern_bytecode(generator, *this, initialization_mode, input_value); } static Bytecode::CodeGenerationErrorOr assign_value_to_variable_declarator(Bytecode::Generator& generator, VariableDeclarator const& declarator, VariableDeclaration const& declaration, ScopedOperand value) @@ -1603,7 +1589,7 @@ static Bytecode::CodeGenerationErrorOr assign_value_to_variable_declarator return {}; }, [&](NonnullRefPtr const& pattern) -> Bytecode::CodeGenerationErrorOr { - return pattern->generate_bytecode(generator, initialization_mode, value, false); + return pattern->generate_bytecode(generator, initialization_mode, value); }); } @@ -2689,7 +2675,7 @@ Bytecode::CodeGenerationErrorOr> TryStatement::generate_ generator.emit(parameter_identifier, Bytecode::Op::EnvironmentMode::Lexical, false); })); - TRY(binding_pattern->generate_bytecode(generator, Bytecode::Op::BindingInitializationMode::Initialize, caught_value, false)); + TRY(binding_pattern->generate_bytecode(generator, Bytecode::Op::BindingInitializationMode::Initialize, caught_value)); return {}; }, [](Empty) -> Bytecode::CodeGenerationErrorOr { @@ -3238,7 +3224,7 @@ static Bytecode::CodeGenerationErrorOr> for_in_of_body_e TRY(generator.emit_store_to_reference(**ptr, next_value)); } else { auto& binding_pattern = lhs.get>(); - TRY(binding_pattern->generate_bytecode(generator, Bytecode::Op::BindingInitializationMode::Set, next_value, false)); + TRY(binding_pattern->generate_bytecode(generator, Bytecode::Op::BindingInitializationMode::Set, next_value)); } } } @@ -3326,8 +3312,7 @@ static Bytecode::CodeGenerationErrorOr> for_in_of_body_e (void)TRY(binding_pattern->generate_bytecode( generator, head_result.lhs_kind == LHSKind::VarBinding ? Bytecode::Op::BindingInitializationMode::Set : Bytecode::Op::BindingInitializationMode::Initialize, - next_value, - false)); + next_value)); } else { return Bytecode::CodeGenerationError { &node, diff --git a/Libraries/LibJS/Bytecode/Generator.cpp b/Libraries/LibJS/Bytecode/Generator.cpp index aac28aa6b7f..0bd16a12e46 100644 --- a/Libraries/LibJS/Bytecode/Generator.cpp +++ b/Libraries/LibJS/Bytecode/Generator.cpp @@ -114,7 +114,7 @@ CodeGenerationErrorOr Generator::emit_function_declaration_instantiation(E auto input_operand = allocate_register(); emit(input_operand.operand(), param_index); auto init_mode = function.shared_data().m_has_duplicates ? Op::BindingInitializationMode::Set : Bytecode::Op::BindingInitializationMode::Initialize; - TRY((*binding_pattern)->generate_bytecode(*this, init_mode, input_operand, false)); + TRY((*binding_pattern)->generate_bytecode(*this, init_mode, input_operand)); } }