summaryrefslogtreecommitdiff
path: root/Userland/Libraries
diff options
context:
space:
mode:
authordavidot <davidot@serenityos.org>2021-11-23 16:46:13 +0100
committerLinus Groh <mail@linusgroh.de>2021-11-29 15:20:07 +0000
commit0535c1abbd6807b901482b5c0cfdd8f7ce20a364 (patch)
tree8a2deaef500cd1ffb87768675d5eb9788da69690 /Userland/Libraries
parent7fd38eac9865e7fa648259305880762e5e4442be (diff)
downloadserenity-0535c1abbd6807b901482b5c0cfdd8f7ce20a364.zip
LibJS: Move the TRY_OR_REJECT macro to PromiseReaction
Also fixes that we ignored the result of the Call which we shouldn't according to the spec.
Diffstat (limited to 'Userland/Libraries')
-rw-r--r--Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp20
-rw-r--r--Userland/Libraries/LibJS/Runtime/PromiseReaction.h20
2 files changed, 20 insertions, 20 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp b/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp
index 9b9346371b..d022f6cbce 100644
--- a/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp
+++ b/Userland/Libraries/LibJS/Runtime/PromiseConstructor.cpp
@@ -38,26 +38,6 @@ static ThrowCompletionOr<Value> get_promise_resolve(GlobalObject& global_object,
return promise_resolve;
}
-// 27.2.1.1.1 IfAbruptRejectPromise ( value, capability ), https://tc39.es/ecma262/#sec-ifabruptrejectpromise
-#define TRY_OR_REJECT(vm, capability, expression) \
- ({ \
- auto _temporary_result = (expression); \
- /* 1. If value is an abrupt completion, then */ \
- if (_temporary_result.is_error()) { \
- vm.clear_exception(); \
- vm.stop_unwind(); \
- \
- /* a. Perform ? Call(capability.[[Reject]], undefined, « value.[[Value]] »). */ \
- (void)vm.call(*capability.reject, js_undefined(), _temporary_result.release_error().value()); \
- \
- /* b. Return capability.[[Promise]]. */ \
- return capability.promise; \
- } \
- \
- /* 2. Else if value is a Completion Record, set value to value.[[Value]]. */ \
- _temporary_result.release_value(); \
- })
-
static bool iterator_record_is_complete(GlobalObject& global_object, Object& iterator_record)
{
auto& vm = global_object.vm();
diff --git a/Userland/Libraries/LibJS/Runtime/PromiseReaction.h b/Userland/Libraries/LibJS/Runtime/PromiseReaction.h
index 669913da7d..23823fccb1 100644
--- a/Userland/Libraries/LibJS/Runtime/PromiseReaction.h
+++ b/Userland/Libraries/LibJS/Runtime/PromiseReaction.h
@@ -19,6 +19,26 @@ struct PromiseCapability {
FunctionObject* reject { nullptr };
};
+// 27.2.1.1.1 IfAbruptRejectPromise ( value, capability ), https://tc39.es/ecma262/#sec-ifabruptrejectpromise
+#define TRY_OR_REJECT(vm, capability, expression) \
+ ({ \
+ auto _temporary_try_or_reject_result = (expression); \
+ /* 1. If value is an abrupt completion, then */ \
+ if (_temporary_try_or_reject_result.is_error()) { \
+ vm.clear_exception(); \
+ vm.stop_unwind(); \
+ \
+ /* a. Perform ? Call(capability.[[Reject]], undefined, « value.[[Value]] »). */ \
+ TRY(vm.call(*capability.reject, js_undefined(), _temporary_try_or_reject_result.release_error().value())); \
+ \
+ /* b. Return capability.[[Promise]]. */ \
+ return capability.promise; \
+ } \
+ \
+ /* 2. Else if value is a Completion Record, set value to value.[[Value]]. */ \
+ _temporary_try_or_reject_result.release_value(); \
+ })
+
// 27.2.1.5 NewPromiseCapability ( C ), https://tc39.es/ecma262/#sec-newpromisecapability
ThrowCompletionOr<PromiseCapability> new_promise_capability(GlobalObject& global_object, Value constructor);