From f4fe9f09a11db589791cd1f14a36843cb4bc6c51 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 22 Jun 2023 16:07:46 +0200 Subject: [PATCH] LibJS/Bytecode: Perform ShadowRealm evaluations in bytecode when enabled --- .../Libraries/LibJS/Runtime/ShadowRealm.cpp | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/ShadowRealm.cpp b/Userland/Libraries/LibJS/Runtime/ShadowRealm.cpp index 5469ea33a2..03395d2f69 100644 --- a/Userland/Libraries/LibJS/Runtime/ShadowRealm.cpp +++ b/Userland/Libraries/LibJS/Runtime/ShadowRealm.cpp @@ -172,12 +172,28 @@ ThrowCompletionOr perform_shadow_realm_eval(VM& vm, StringView source_tex // 17. If result.[[Type]] is normal, then if (!eval_result.is_throw_completion()) { - // FIXME: Remove once everything uses the VM's current realm. - auto eval_realm_interpreter = Interpreter::create_with_existing_realm(eval_realm); - - // TODO: Optionally use bytecode interpreter? // a. Set result to the result of evaluating body. - result = program->execute(*eval_realm_interpreter); + if (auto* bytecode_interpreter = vm.bytecode_interpreter_if_exists()) { + auto maybe_executable = Bytecode::compile(vm, program, 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(eval_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 { + // FIXME: Remove once everything uses the VM's current realm. + auto eval_realm_interpreter = Interpreter::create_with_existing_realm(eval_realm); + + result = program->execute(*eval_realm_interpreter); + } } // 18. If result.[[Type]] is normal and result.[[Value]] is empty, then