@@ -256,12 +256,7 @@ ThrowCompletionOr<Value> Interpreter::run(Script& script_record, GC::Ptr<Environ
256256 // 13. If result.[[Type]] is normal, then
257257 if (executable) {
258258 // a. Set result to Completion(Evaluation of script).
259- auto result_or_error = run_executable (*script_context, *executable, {}, {});
260- if (result_or_error.value .is_error ())
261- result = result_or_error.value .release_error ();
262- else {
263- result = result_or_error.return_register_value .is_special_empty_value () ? normal_completion (js_undefined ()) : result_or_error.return_register_value ;
264- }
259+ result = run_executable (*script_context, *executable, {}, {});
265260
266261 // b. If result is a normal completion and result.[[Value]] is empty, then
267262 if (result.type () == Completion::Type::Normal && result.value ().is_special_empty_value ()) {
@@ -707,7 +702,7 @@ Utf16FlyString const& Interpreter::get_identifier(IdentifierTableIndex index) co
707702 return m_running_execution_context->identifier_table .data ()[index.value ];
708703}
709704
710- Interpreter::ResultAndReturnRegister Interpreter::run_executable (ExecutionContext& context, Executable& executable, Optional<size_t > entry_point, Value initial_accumulator_value)
705+ ThrowCompletionOr<Value> Interpreter::run_executable (ExecutionContext& context, Executable& executable, Optional<size_t > entry_point, Value initial_accumulator_value)
711706{
712707 dbgln_if (JS_BYTECODE_DEBUG, " Bytecode::Interpreter will run unit {}" , &executable);
713708
@@ -754,17 +749,23 @@ Interpreter::ResultAndReturnRegister Interpreter::run_executable(ExecutionContex
754749 }
755750 }
756751
757- auto return_value = js_undefined ();
758- if (!reg (Register::return_value ()).is_special_empty_value ())
759- return_value = reg (Register::return_value ());
752+ Value return_value;
753+ if (auto return_register_value = reg (Register::return_value ()); !return_register_value.is_special_empty_value ())
754+ return_value = return_register_value;
755+ else {
756+ return_value = reg (Register::accumulator ());
757+ if (return_value.is_special_empty_value ())
758+ return_value = js_undefined ();
759+ }
760+
760761 auto exception = reg (Register::exception ());
761762
762763 vm ().run_queued_promise_jobs ();
763764 vm ().finish_execution_generation ();
764765
765- if (!exception.is_special_empty_value ())
766- return { throw_completion (exception), registers_and_constants_and_locals_and_arguments[ 0 ] } ;
767- return { return_value, registers_and_constants_and_locals_and_arguments[ 0 ] } ;
766+ if (!exception.is_special_empty_value ()) [[unlikely]]
767+ return throw_completion (exception);
768+ return return_value;
768769}
769770
770771void Interpreter::enter_unwind_context ()
0 commit comments