Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1722)

Unified Diff: src/promise.js

Issue 440773004: Trigger exception debug events on Promise reject. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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.

Powered by Google App Engine
This is Rietveld 408576698