From 878668efc9006b590e7ef6ef0c7a0d99e6a09a90 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Sun, 14 Nov 2021 01:07:10 +0000 Subject: [PATCH] LibJS: Call [[Reject]] in PromiseResolveThenableJob after abrupt then() --- Userland/Libraries/LibJS/Runtime/PromiseJobs.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibJS/Runtime/PromiseJobs.cpp b/Userland/Libraries/LibJS/Runtime/PromiseJobs.cpp index 99d7eb13548..bad5a263d2f 100644 --- a/Userland/Libraries/LibJS/Runtime/PromiseJobs.cpp +++ b/Userland/Libraries/LibJS/Runtime/PromiseJobs.cpp @@ -138,16 +138,15 @@ ThrowCompletionOr PromiseResolveThenableJob::call() // c. If thenCallResult is an abrupt completion, then if (then_call_result.is_error()) { - auto error = then_call_result.throw_completion().value(); vm.clear_exception(); vm.stop_unwind(); // i. Let status be Call(resolvingFunctions.[[Reject]], undefined, « thenCallResult.[[Value]] »). - // FIXME: Actually do this... not sure why we don't? :yakfused: + dbgln_if(PROMISE_DEBUG, "[PromiseResolveThenableJob @ {}]: then_call_result is an abrupt completion, calling reject function with value {}", this, then_call_result.throw_completion().value()); + auto status = JS::call(global_object, &reject_function, js_undefined(), then_call_result.throw_completion().value()); // ii. Return Completion(status). - dbgln_if(PROMISE_DEBUG, "[PromiseResolveThenableJob @ {}]: An exception was thrown, returning error {}", this, error); - return error; + return status; } // d. Return Completion(thenCallResult).