diff --git a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp index 38a5add979..f1da5e2464 100644 --- a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp +++ b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp @@ -244,4 +244,24 @@ ThrowCompletionOr typeof_variable(VM& vm, DeprecatedFlyString const& stri return PrimitiveString::create(vm, value.typeof()); } +ThrowCompletionOr set_variable( + VM& vm, + DeprecatedFlyString const& name, + Value value, + Op::EnvironmentMode mode, + Op::SetVariable::InitializationMode initialization_mode) +{ + auto environment = mode == Op::EnvironmentMode::Lexical ? vm.running_execution_context().lexical_environment : vm.running_execution_context().variable_environment; + auto reference = TRY(vm.resolve_binding(name, environment)); + switch (initialization_mode) { + case Op::SetVariable::InitializationMode::Initialize: + TRY(reference.initialize_referenced_binding(vm, value)); + break; + case Op::SetVariable::InitializationMode::Set: + TRY(reference.put_value(vm, value)); + break; + } + return {}; +} + } diff --git a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h index 6524271f17..c23567b7bc 100644 --- a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h +++ b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h @@ -21,5 +21,6 @@ ThrowCompletionOr perform_call(Interpreter&, Value this_value, Op::CallTy template ThrowCompletionOr throw_if_needed_for_call(Interpreter&, InstructionType const&, Value callee); ThrowCompletionOr typeof_variable(VM&, DeprecatedFlyString const&); +ThrowCompletionOr set_variable(VM&, DeprecatedFlyString const&, Value, Op::EnvironmentMode, Op::SetVariable::InitializationMode); } diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp index 7c2151e3f1..f8e7dd38f7 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -925,16 +925,7 @@ ThrowCompletionOr SetVariable::execute_impl(Bytecode::Interpreter& interpr { auto& vm = interpreter.vm(); auto const& name = interpreter.current_executable().get_identifier(m_identifier); - auto environment = m_mode == EnvironmentMode::Lexical ? vm.running_execution_context().lexical_environment : vm.running_execution_context().variable_environment; - auto reference = TRY(vm.resolve_binding(name, environment)); - switch (m_initialization_mode) { - case InitializationMode::Initialize: - TRY(reference.initialize_referenced_binding(vm, interpreter.accumulator())); - break; - case InitializationMode::Set: - TRY(reference.put_value(vm, interpreter.accumulator())); - break; - } + TRY(set_variable(vm, name, interpreter.accumulator(), m_mode, m_initialization_mode)); return {}; } diff --git a/Userland/Libraries/LibJS/Bytecode/Op.h b/Userland/Libraries/LibJS/Bytecode/Op.h index 3a49dd1567..f8dd6fe94f 100644 --- a/Userland/Libraries/LibJS/Bytecode/Op.h +++ b/Userland/Libraries/LibJS/Bytecode/Op.h @@ -428,6 +428,8 @@ public: DeprecatedString to_deprecated_string_impl(Bytecode::Executable const&) const; IdentifierTableIndex identifier() const { return m_identifier; } + EnvironmentMode mode() const { return m_mode; } + InitializationMode initialization_mode() const { return m_initialization_mode; } private: IdentifierTableIndex m_identifier;