diff --git a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp index f0e24c6376..2f3c69e0fe 100644 --- a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp +++ b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.cpp @@ -449,4 +449,26 @@ ThrowCompletionOr create_variable(VM& vm, DeprecatedFlyString const& name, return verify_cast(vm.variable_environment())->create_global_var_binding(name, false); } +ThrowCompletionOr new_class(VM& vm, ClassExpression const& class_expression, Optional const& lhs_name) +{ + auto& interpreter = vm.bytecode_interpreter(); + auto name = class_expression.name(); + auto super_class = interpreter.accumulator(); + + // NOTE: NewClass expects classEnv to be active lexical environment + auto* class_environment = vm.lexical_environment(); + vm.running_execution_context().lexical_environment = interpreter.saved_lexical_environment_stack().take_last(); + + DeprecatedFlyString binding_name; + DeprecatedFlyString class_name; + if (!class_expression.has_name() && lhs_name.has_value()) { + class_name = interpreter.current_executable().get_identifier(lhs_name.value()); + } else { + binding_name = name; + class_name = name.is_null() ? ""sv : name; + } + + return TRY(class_expression.create_class_constructor(vm, class_environment, vm.lexical_environment(), super_class, binding_name, class_name)); +} + } diff --git a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h index 478a863a17..723216dbf1 100644 --- a/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h +++ b/Userland/Libraries/LibJS/Bytecode/CommonImplementations.h @@ -33,5 +33,6 @@ ThrowCompletionOr get_callee_and_this_from_environment(Bytecode:: Value new_regexp(VM&, ParsedRegex const&, DeprecatedString const& pattern, DeprecatedString const& flags); MarkedVector argument_list_evaluation(Bytecode::Interpreter&); ThrowCompletionOr create_variable(VM&, DeprecatedFlyString const& name, Op::EnvironmentMode, bool is_global, bool is_immutable, bool is_strict); +ThrowCompletionOr new_class(VM&, ClassExpression const&, Optional const& lhs_name); } diff --git a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp index d8b523089a..f6e8ba0c96 100644 --- a/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp +++ b/Userland/Libraries/LibJS/Bytecode/Interpreter.cpp @@ -1443,25 +1443,7 @@ ThrowCompletionOr IteratorResultValue::execute_impl(Bytecode::Interpreter& ThrowCompletionOr NewClass::execute_impl(Bytecode::Interpreter& interpreter) const { - auto& vm = interpreter.vm(); - auto name = m_class_expression.name(); - auto super_class = interpreter.accumulator(); - - // NOTE: NewClass expects classEnv to be active lexical environment - auto class_environment = vm.lexical_environment(); - vm.running_execution_context().lexical_environment = interpreter.saved_lexical_environment_stack().take_last(); - - DeprecatedFlyString binding_name; - DeprecatedFlyString class_name; - if (!m_class_expression.has_name() && m_lhs_name.has_value()) { - class_name = interpreter.current_executable().get_identifier(m_lhs_name.value()); - } else { - binding_name = name; - class_name = name.is_null() ? ""sv : name; - } - - interpreter.accumulator() = TRY(m_class_expression.create_class_constructor(vm, class_environment, vm.lexical_environment(), super_class, binding_name, class_name)); - + interpreter.accumulator() = TRY(new_class(interpreter.vm(), m_class_expression, m_lhs_name)); return {}; }