diff --git a/Userland/Libraries/LibJS/SourceTextModule.cpp b/Userland/Libraries/LibJS/SourceTextModule.cpp index a647b3a844..d16eefb8b4 100644 --- a/Userland/Libraries/LibJS/SourceTextModule.cpp +++ b/Userland/Libraries/LibJS/SourceTextModule.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -690,7 +691,26 @@ ThrowCompletionOr SourceTextModule::execute_module(VM& vm, GCPtrexecute(vm.interpreter()); + Completion result; + + if (auto* bytecode_interpreter = vm.bytecode_interpreter_if_exists()) { + auto maybe_executable = Bytecode::compile(vm, m_ecmascript_code, FunctionKind::Normal, "ShadowRealmEval"sv); + if (maybe_executable.is_error()) + result = maybe_executable.release_error(); + else { + auto executable = maybe_executable.release_value(); + + auto value_and_frame = bytecode_interpreter->run_and_return_frame(realm(), *executable, nullptr); + if (value_and_frame.value.is_error()) { + result = value_and_frame.value.release_error(); + } else { + // Resulting value is in the accumulator. + result = value_and_frame.frame->registers.at(0).value_or(js_undefined()); + } + } + } else { + result = m_ecmascript_code->execute(vm.interpreter()); + } // d. Let env be moduleContext's LexicalEnvironment. auto env = module_context.lexical_environment; @@ -708,7 +728,7 @@ ThrowCompletionOr SourceTextModule::execute_module(VM& vm, GCPtr