Index: src/promise.js |
diff --git a/src/promise.js b/src/promise.js |
index 0c930e6338d85746fe2b8ea187b6439b798da16c..2d8314a42fa5d8d5b0ec05638efec2d9a5ccbf03 100644 |
--- a/src/promise.js |
+++ b/src/promise.js |
@@ -18,6 +18,7 @@ var PromiseReject; |
var PromiseChain; |
var PromiseCatch; |
var PromiseThen; |
+var PromiseHasRejectHandler; |
// mirror-debugger.js currently uses builtins.promiseStatus. It would be nice |
// if we could move these property names into the closure below. |
@@ -29,6 +30,7 @@ var promiseValue = GLOBAL_PRIVATE("Promise#value"); |
var promiseOnResolve = GLOBAL_PRIVATE("Promise#onResolve"); |
var promiseOnReject = GLOBAL_PRIVATE("Promise#onReject"); |
var promiseRaw = GLOBAL_PRIVATE("Promise#raw"); |
+var promiseDebug = GLOBAL_PRIVATE("Promise#debug"); |
var lastMicrotaskId = 0; |
(function() { |
@@ -40,13 +42,13 @@ var lastMicrotaskId = 0; |
throw MakeTypeError('resolver_not_a_function', [resolver]); |
var promise = PromiseInit(this); |
try { |
- %DebugPromiseHandlePrologue(function() { return promise }); |
+ %DebugPushPromise(promise); |
resolver(function(x) { PromiseResolve(promise, x) }, |
function(r) { PromiseReject(promise, r) }); |
} catch (e) { |
PromiseReject(promise, e); |
} finally { |
- %DebugPromiseHandleEpilogue(); |
+ %DebugPopPromise(); |
} |
} |
@@ -98,11 +100,7 @@ var lastMicrotaskId = 0; |
function PromiseHandle(value, handler, deferred) { |
try { |
- %DebugPromiseHandlePrologue( |
- function() { |
- var queue = GET_PRIVATE(deferred.promise, promiseOnReject); |
- return (queue && queue.length == 0) ? deferred.promise : UNDEFINED; |
- }); |
+ %DebugPushPromise(deferred.promise); |
var result = handler(value); |
if (result === deferred.promise) |
throw MakeTypeError('promise_cyclic', [result]); |
@@ -111,14 +109,9 @@ var lastMicrotaskId = 0; |
else |
deferred.resolve(result); |
} catch (exception) { |
- try { |
- %DebugPromiseHandlePrologue(function() { return deferred.promise }); |
- deferred.reject(exception); |
- } catch (e) { } finally { |
- %DebugPromiseHandleEpilogue(); |
- } |
+ try { deferred.reject(exception); } catch (e) { } |
} finally { |
- %DebugPromiseHandleEpilogue(); |
+ %DebugPopPromise(); |
} |
} |
@@ -165,6 +158,13 @@ var lastMicrotaskId = 0; |
} |
PromiseReject = function PromiseReject(promise, r) { |
+ // Check promise status to confirm that this reject has an effect. |
+ // Check promiseDebug property to avoid duplicate event. |
+ if (DEBUG_IS_ACTIVE && |
+ GET_PRIVATE(promise, promiseStatus) == 0 && |
+ !HAS_PRIVATE(promise, promiseDebug)) { |
+ %DebugPromiseRejectEvent(promise, r); |
+ } |
PromiseDone(promise, -1, r, promiseOnReject) |
} |
@@ -322,6 +322,16 @@ var lastMicrotaskId = 0; |
return deferred.promise; |
} |
+ |
+ // Utility for debugger |
+ |
+ PromiseHasRejectHandler = function PromiseHasRejectHandler() { |
+ // Mark promise as already having triggered a reject event. |
+ SET_PRIVATE(this, promiseDebug, true); |
+ var queue = GET_PRIVATE(this, promiseOnReject); |
+ return !IS_UNDEFINED(queue) && queue.length > 0; |
+ }; |
+ |
// ------------------------------------------------------------------- |
// Install exported functions. |