summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibJS
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2021-07-05 13:10:04 +0100
committerLinus Groh <mail@linusgroh.de>2021-07-05 14:14:54 +0100
commit073071c634ab27ab3c2ec16237d4e1fd018f662e (patch)
treeeea26e5eb38f8b9dd9bdd4ff4e65013fc9ac293c /Userland/Libraries/LibJS
parentfe9dc473204d79e868dbc28c70976be3a9d3a64b (diff)
downloadserenity-073071c634ab27ab3c2ec16237d4e1fd018f662e.zip
LibJS: Fix Promise constructor reject function argument
If calling the executor function throws an exception, the return value of `vm.call()` will be an empty value, which we then passed as an argument to the reject function, which is incorrect - what it actually needs is the exception value. This stems from a misunderstanding of the spec I had at the time of implementing this - in their case, the exception value is part of the completion record returned by Call(). This error was previously masked as we would use a fallback (`value_or(js_undefined())` for the empty value argument, but that was removed in 57f7e6e. Fixes #8447.
Diffstat (limited to 'Userland/Libraries/LibJS')
-rw-r--r--Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp b/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp
index 16e46f6b52..531eebc1e6 100644
--- a/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp
+++ b/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp
@@ -68,11 +68,11 @@ Value PromiseConstructor::construct(FunctionObject& new_target)
auto [resolve_function, reject_function] = promise->create_resolving_functions();
- auto completion_value = vm.call(executor.as_function(), js_undefined(), &resolve_function, &reject_function);
- if (vm.exception()) {
+ (void)vm.call(executor.as_function(), js_undefined(), &resolve_function, &reject_function);
+ if (auto* exception = vm.exception()) {
vm.clear_exception();
vm.stop_unwind();
- [[maybe_unused]] auto result = vm.call(reject_function, js_undefined(), completion_value);
+ (void)vm.call(reject_function, js_undefined(), exception->value());
}
return promise;
}