Chromium Code Reviews| Index: src/promise.js |
| diff --git a/src/promise.js b/src/promise.js |
| index 0c930e6338d85746fe2b8ea187b6439b798da16c..43eb8d8619742dbe94482bdb94d94d28db496150 100644 |
| --- a/src/promise.js |
| +++ b/src/promise.js |
| @@ -29,8 +29,11 @@ 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; |
| +var PromiseHasRejectHandler; |
|
rossberg
2014/08/05 13:35:08
Nit: move this up to the other Promise* vars.
Tho
Yang
2014/08/06 09:36:23
Done.
|
| + |
| (function() { |
| var $Promise = function Promise(resolver) { |
| @@ -40,13 +43,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 +101,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 +110,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 +159,10 @@ var lastMicrotaskId = 0; |
| } |
| PromiseReject = function PromiseReject(promise, r) { |
| + // Check promiseDebug property to avoid duplicate event. |
| + if (DEBUG_IS_ACTIVE && !HAS_PRIVATE(promise, promiseDebug)) { |
| + %DebugPromiseRejectEvent(promise, r); |
| + } |
| PromiseDone(promise, -1, r, promiseOnReject) |
| } |
| @@ -322,6 +320,18 @@ var lastMicrotaskId = 0; |
| return deferred.promise; |
| } |
| + |
| + // Utility for debugger |
| + |
| + PromiseHasRejectHandler = function PromiseHasRejectHandler() { |
| + var queue = GET_PRIVATE(this, promiseOnReject); |
|
rossberg
2014/08/05 13:35:08
Nit: move this line down by 2.
Yang
2014/08/06 09:36:23
Done.
|
| + // Mark promise as already triggered a reject event. |
| + SET_PRIVATE(this, promiseDebug, true); |
| + // If already rejected/resolved, the handlers have already been fired. |
|
rossberg
2014/08/05 13:35:08
If the status isn't 0 then the queue should be und
Yang
2014/08/06 09:36:23
Done.
|
| + if (GET_PRIVATE(this, promiseStatus) !== 0) return true; |
| + return queue && queue.length > 0; |
| + }; |
| + |
| // ------------------------------------------------------------------- |
| // Install exported functions. |