Index: src/js/promise.js |
diff --git a/src/js/promise.js b/src/js/promise.js |
index 93758caf9513b4bb3db8889ef6cf44cd0d750ca8..ddfccf82daacddbe83453cd25ef477b54468a1bb 100644 |
--- a/src/js/promise.js |
+++ b/src/js/promise.js |
@@ -46,7 +46,7 @@ utils.Import(function(from) { |
// [[PromiseState]] values: |
const kPending = 0; |
const kFulfilled = +1; |
-const kRejected = -1; |
+const kRejected = +2; |
// ES#sec-createresolvingfunctions |
// CreateResolvingFunctions ( promise ) |
@@ -66,7 +66,8 @@ function CreateResolvingFunctions(promise, debugEvent) { |
var reject = reason => { |
if (alreadyResolved === true) return; |
alreadyResolved = true; |
- RejectPromise(promise, reason, debugEvent); |
+ %PromiseReject(promise, reason, debugEvent); |
+ PromiseSet(promise, kRejected, reason); |
}; |
return { |
@@ -157,7 +158,8 @@ function PromiseHandle(value, handler, deferred) { |
if (IS_UNDEFINED(deferred.reject)) { |
// Pass false for debugEvent so .then chaining does not trigger |
// redundant ExceptionEvents. |
- RejectPromise(deferred.promise, exception, false); |
+ %PromiseReject(deferred.promise, exception, false); |
+ PromiseSet(deferred.promise, kRejected, exception); |
} else { |
%_Call(deferred.reject, UNDEFINED, exception); |
} |
@@ -243,16 +245,19 @@ function PromiseCreate() { |
// Promise Resolve Functions, steps 6-13 |
function ResolvePromise(promise, resolution) { |
if (resolution === promise) { |
- return RejectPromise(promise, |
- %make_type_error(kPromiseCyclic, resolution), |
- true); |
+ var exception = %make_type_error(kPromiseCyclic, resolution); |
+ %PromiseReject(promise, exception, true); |
+ PromiseSet(promise, kRejected, exception); |
+ return; |
} |
if (IS_RECEIVER(resolution)) { |
// 25.4.1.3.2 steps 8-12 |
try { |
var then = resolution.then; |
} catch (e) { |
- return RejectPromise(promise, e, true); |
+ %PromiseReject(promise, e, true); |
+ PromiseSet(promise, kRejected, e); |
+ return; |
} |
// Resolution is a native promise and if it's already resolved or |
@@ -277,7 +282,8 @@ function ResolvePromise(promise, resolution) { |
%PromiseRevokeReject(resolution); |
} |
// Don't cause a debug event as this case is forwarding a rejection |
- RejectPromise(promise, thenableValue, false); |
+ %PromiseReject(promise, thenableValue, false); |
+ PromiseSet(promise, kRejected, thenableValue); |
SET_PRIVATE(resolution, promiseHasHandlerSymbol, true); |
return; |
} |
@@ -299,26 +305,11 @@ function ResolvePromise(promise, resolution) { |
PromiseSet(promise, kFulfilled, resolution); |
} |
-// ES#sec-rejectpromise |
-// RejectPromise ( promise, reason ) |
-function RejectPromise(promise, reason, debugEvent) { |
- // Call runtime for callbacks to the debugger or for unhandled reject. |
- // The debugEvent parameter sets whether a debug ExceptionEvent should |
- // be triggered. It should be set to false when forwarding a rejection |
- // rather than creating a new one. |
- // This check is redundant with checks in the runtime, but it may help |
- // avoid unnecessary runtime calls. |
- if ((debugEvent && DEBUG_IS_ACTIVE) || |
- !HAS_DEFINED_PRIVATE(promise, promiseHasHandlerSymbol)) { |
- %PromiseRejectEvent(promise, reason, debugEvent); |
- } |
- %PromiseFulfill(promise, kRejected, reason, promiseRejectReactionsSymbol) |
- PromiseSet(promise, kRejected, reason); |
-} |
- |
// Export to bindings |
function DoRejectPromise(promise, reason) { |
- return RejectPromise(promise, reason, true); |
+ %PromiseReject(promise, reason, true); |
+ PromiseSet(promise, kRejected, reason); |
+ return; |
} |
// ES#sec-newpromisecapability |
@@ -665,12 +656,14 @@ utils.Export(function(to) { |
to.IsPromise = IsPromise; |
to.PromiseCreate = PromiseCreate; |
to.PromiseThen = PromiseThen; |
+ to.PromiseSet = PromiseSet; |
to.GlobalPromise = GlobalPromise; |
to.NewPromiseCapability = NewPromiseCapability; |
to.PerformPromiseThen = PerformPromiseThen; |
to.ResolvePromise = ResolvePromise; |
- to.RejectPromise = RejectPromise; |
+ |
+ to.kPromiseRejected = kRejected; |
}); |
}) |