Reviewers: aandrey,

https://codereview.chromium.org/461023002/diff/1/test/mjsunit/es6/reject-caught-by-default-reject-handler.js
File test/mjsunit/es6/reject-caught-by-default-reject-handler.js
(right):

https://codereview.chromium.org/461023002/diff/1/test/mjsunit/es6/reject-caught-by-default-reject-handler.js#newcode46
test/mjsunit/es6/reject-caught-by-default-reject-handler.js:46:
assertEquals(0, exec_state.frameCount());
Note that this is because the promise is rejected from within native JS
code due to the return value being a rejected promise. Devtools will
just ignore this still, because there is no stack trace. I really have
no idea how to solve this.

Description:
Ignore default reject handler when looking for reject handlers.


LOG=N
BUG=v8:3093

Please review this at https://codereview.chromium.org/461023002/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+62, -34 lines):
  M src/promise.js
  A + test/mjsunit/es6/reject-caught-by-default-reject-handler.js
  A + test/mjsunit/es6/throw-caught-by-default-reject-handler.js


Index: src/promise.js
diff --git a/src/promise.js b/src/promise.js
index 2d8314a42fa5d8d5b0ec05638efec2d9a5ccbf03..bbc832d0f446cc62372e1ba3b883b3786bb70058 100644
--- a/src/promise.js
+++ b/src/promise.js
@@ -324,12 +324,23 @@ var lastMicrotaskId = 0;


   // Utility for debugger
+
+  function PromiseHasRejectHandlerRecursive(promise) {
+    var queue = GET_PRIVATE(promise, promiseOnReject);
+    if (IS_UNDEFINED(queue)) return false;
+    // Do a depth first search for a reject handler that's not
+    // the default PromiseIdRejectHandler.
+    for (var i = 0; i < queue.length; i += 2) {
+      if (queue[i] != PromiseIdRejectHandler) return true;
+      if (PromiseHasRejectHandlerRecursive(queue[i + 1])) return true;
+    }
+    return false;
+  }

   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;
+    return PromiseHasRejectHandlerRecursive(this);
   };

   // -------------------------------------------------------------------
Index: test/mjsunit/es6/reject-caught-by-default-reject-handler.js
diff --git a/test/mjsunit/es6/debug-promises/reject-uncaught-late.js b/test/mjsunit/es6/reject-caught-by-default-reject-handler.js
similarity index 63%
copy from test/mjsunit/es6/debug-promises/reject-uncaught-late.js
copy to test/mjsunit/es6/reject-caught-by-default-reject-handler.js
index 4a883da13a793972d00fd2f4a9f8311b15b04811..7760b0eb4cfbb3ffad0f07dac3c13e7918204328 100644
--- a/test/mjsunit/es6/debug-promises/reject-uncaught-late.js
+++ b/test/mjsunit/es6/reject-caught-by-default-reject-handler.js
@@ -10,24 +10,27 @@

 Debug = debug.Debug;

-var expected_events = 1;
+var expected_events = 2;
 var log = [];

-var reject_closure;
-
-var p = new Promise(function(resolve, reject) {
-  log.push("postpone p");
-  reject_closure = reject;
+var resolve, reject;
+var p0 = new Promise(function(res, rej) { resolve = res; reject = rej; });
+var p1 = p0.then(function() {
+  log.push("p0.then");
+  return Promise.reject(new Error("123"));
+});
+var p2 = p1.then(function() {
+  log.push("p1.then");
 });

-var q = new Promise(function(resolve, reject) {
+var q = new Promise(function(res, rej) {
   log.push("resolve q");
-  resolve();
+  res();
 });

 q.then(function() {
-  log.push("reject p");
-  reject_closure(new Error("uncaught reject p"));  // event
+  log.push("resolve p");
+  resolve();
 })


@@ -36,12 +39,17 @@ function listener(event, exec_state, event_data, data) {
     if (event == Debug.DebugEvent.Exception) {
       expected_events--;
       assertTrue(expected_events >= 0);
-      assertEquals("uncaught reject p", event_data.exception().message);
-      assertTrue(event_data.promise() instanceof Promise);
-      assertSame(p, event_data.promise());
       assertTrue(event_data.uncaught());
-      // Assert that the debug event is triggered at the throw site.
- assertTrue(exec_state.frame(0).sourceLineText().indexOf("// event")
0);
+      assertTrue(event_data.promise() instanceof Promise);
+      if (expected_events == 1) {
+        // p1 is rejected, uncaught except for its default reject handler.
+        assertEquals(0, exec_state.frameCount());
+        assertSame(p1, event_data.promise());
+      } else {
+        // p2 is rejected by p1's default reject handler.
+        assertEquals(0, exec_state.frameCount());
+        assertSame(p2, event_data.promise());
+      }
     }
   } catch (e) {
     %AbortJS(e + "\n" + e.stack);
@@ -58,7 +66,7 @@ function testDone(iteration) {
     try {
       assertTrue(iteration < 10);
       if (expected_events === 0) {
- assertEquals(["postpone p", "resolve q", "end main", "reject p"], log); + assertEquals(["resolve q", "end main", "resolve p", "p0.then"], log);
       } else {
         testDone(iteration + 1);
       }
Index: test/mjsunit/es6/throw-caught-by-default-reject-handler.js
diff --git a/test/mjsunit/es6/debug-promises/reject-uncaught-late.js b/test/mjsunit/es6/throw-caught-by-default-reject-handler.js
similarity index 61%
copy from test/mjsunit/es6/debug-promises/reject-uncaught-late.js
copy to test/mjsunit/es6/throw-caught-by-default-reject-handler.js
index 4a883da13a793972d00fd2f4a9f8311b15b04811..89fc060c9f2778f1f3fc1dabf88659292ac78a05 100644
--- a/test/mjsunit/es6/debug-promises/reject-uncaught-late.js
+++ b/test/mjsunit/es6/throw-caught-by-default-reject-handler.js
@@ -10,24 +10,27 @@

 Debug = debug.Debug;

-var expected_events = 1;
+var expected_events = 2;
 var log = [];

-var reject_closure;
-
-var p = new Promise(function(resolve, reject) {
-  log.push("postpone p");
-  reject_closure = reject;
+var resolve, reject;
+var p0 = new Promise(function(res, rej) { resolve = res; reject = rej; });
+var p1 = p0.then(function() {
+  log.push("p0.then");
+  throw new Error("123");  // event
+});
+var p2 = p1.then(function() {
+  log.push("p1.then");
 });

-var q = new Promise(function(resolve, reject) {
+var q = new Promise(function(res, rej) {
   log.push("resolve q");
-  resolve();
+  res();
 });

 q.then(function() {
-  log.push("reject p");
-  reject_closure(new Error("uncaught reject p"));  // event
+  log.push("resolve p");
+  resolve();
 })


@@ -36,12 +39,18 @@ function listener(event, exec_state, event_data, data) {
     if (event == Debug.DebugEvent.Exception) {
       expected_events--;
       assertTrue(expected_events >= 0);
-      assertEquals("uncaught reject p", event_data.exception().message);
-      assertTrue(event_data.promise() instanceof Promise);
-      assertSame(p, event_data.promise());
       assertTrue(event_data.uncaught());
-      // Assert that the debug event is triggered at the throw site.
- assertTrue(exec_state.frame(0).sourceLineText().indexOf("// event")
0);
+      assertTrue(event_data.promise() instanceof Promise);
+      if (expected_events == 1) {
+        // p1 is rejected, uncaught except for its default reject handler.
+        assertTrue(
+            exec_state.frame(0).sourceLineText().indexOf("// event") > 0);
+        assertSame(p1, event_data.promise());
+      } else {
+        // p2 is rejected by p1's default reject handler.
+        assertEquals(0, exec_state.frameCount());
+        assertSame(p2, event_data.promise());
+      }
     }
   } catch (e) {
     %AbortJS(e + "\n" + e.stack);
@@ -58,7 +67,7 @@ function testDone(iteration) {
     try {
       assertTrue(iteration < 10);
       if (expected_events === 0) {
- assertEquals(["postpone p", "resolve q", "end main", "reject p"], log); + assertEquals(["resolve q", "end main", "resolve p", "p0.then"], log);
       } else {
         testDone(iteration + 1);
       }


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to