|
@@ -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);
|
|
|
|