Index: src/js/promise.js |
diff --git a/src/js/promise.js b/src/js/promise.js |
index c057238af696d78416a6198b3c0f68dabb8c31c1..e020028c244f8f0d45bf429316ae916757012de5 100644 |
--- a/src/js/promise.js |
+++ b/src/js/promise.js |
@@ -12,6 +12,8 @@ |
// Imports |
var InternalArray = utils.InternalArray; |
+var promiseAwaitHandlerSymbol = |
+ utils.ImportNow("promise_await_handler_symbol"); |
var promiseCombinedDeferredSymbol = |
utils.ImportNow("promise_combined_deferred_symbol"); |
var promiseHasHandlerSymbol = |
@@ -22,6 +24,8 @@ var promiseFulfillReactionsSymbol = |
utils.ImportNow("promise_fulfill_reactions_symbol"); |
var promiseDeferredReactionsSymbol = |
utils.ImportNow("promise_deferred_reactions_symbol"); |
+var promiseHandledHintSymbol = |
+ utils.ImportNow("promise_handled_hint_symbol"); |
var promiseRawSymbol = utils.ImportNow("promise_raw_symbol"); |
var promiseStateSymbol = utils.ImportNow("promise_state_symbol"); |
var promiseResultSymbol = utils.ImportNow("promise_result_symbol"); |
@@ -381,16 +385,6 @@ function PromiseReject(r) { |
} |
} |
-function PromiseCastResolved(value) { |
- if (IsPromise(value)) { |
- return value; |
- } else { |
- var promise = PromiseInit(new GlobalPromise(promiseRawSymbol)); |
- var resolveResult = ResolvePromise(promise, value); |
- return promise; |
- } |
-} |
- |
function PerformPromiseThen(promise, onResolve, onReject, resultCapability) { |
if (!IS_CALLABLE(onResolve)) onResolve = PromiseIdResolveHandler; |
if (!IS_CALLABLE(onReject)) onReject = PromiseIdRejectHandler; |
@@ -543,6 +537,9 @@ function PromiseRace(iterable) { |
// Utility for debugger |
function PromiseHasUserDefinedRejectHandlerCheck(handler, deferred) { |
+ // If this handler was installed by async/await, it does not indicate |
+ // that there is a user-defined reject handler. |
+ if (GET_PRIVATE(handler, promiseAwaitHandlerSymbol)) return false; |
if (handler !== PromiseIdRejectHandler) { |
var combinedDeferred = GET_PRIVATE(handler, promiseCombinedDeferredSymbol); |
if (IS_UNDEFINED(combinedDeferred)) return true; |
@@ -556,16 +553,22 @@ function PromiseHasUserDefinedRejectHandlerCheck(handler, deferred) { |
} |
function PromiseHasUserDefinedRejectHandlerRecursive(promise) { |
+ // If this promise was marked as being handled by a catch block |
+ // in an async function, then it has a user-defined reject handler. |
+ if (GET_PRIVATE(promise, promiseHandledHintSymbol)) return true; |
+ |
var queue = GET_PRIVATE(promise, promiseRejectReactionsSymbol); |
var deferreds = GET_PRIVATE(promise, promiseDeferredReactionsSymbol); |
+ |
if (IS_UNDEFINED(queue)) return false; |
+ |
if (!IS_ARRAY(queue)) { |
return PromiseHasUserDefinedRejectHandlerCheck(queue, deferreds); |
- } else { |
- for (var i = 0; i < queue.length; i += 2) { |
- if (PromiseHasUserDefinedRejectHandlerCheck(queue[i], queue[i + 1])) { |
- return true; |
- } |
+ } |
+ |
+ for (var i = 0; i < queue.length; i += 2) { |
+ if (PromiseHasUserDefinedRejectHandlerCheck(queue[i], queue[i + 1])) { |
+ return true; |
} |
} |
return false; |
@@ -623,12 +626,14 @@ utils.InstallFunctions(extrasUtils, 0, [ |
]); |
utils.Export(function(to) { |
- to.PromiseCastResolved = PromiseCastResolved; |
+ to.IsPromise = IsPromise; |
+ to.PromiseCreate = PromiseCreate; |
to.PromiseThen = PromiseThen; |
to.GlobalPromise = GlobalPromise; |
to.NewPromiseCapability = NewPromiseCapability; |
to.PerformPromiseThen = PerformPromiseThen; |
+ to.ResolvePromise = ResolvePromise; |
to.RejectPromise = RejectPromise; |
}); |