From cf75a0b6e6853045c33e8daf795e4ad471b0cfa6 Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Mon, 18 Aug 2014 08:43:11 +0000 Subject: [PATCH] Fix PromiseHasRejectHandler. The odd-numbered items in the queue are deferred objects, not promises. R=aandrey@chromium.org Review URL: https://codereview.chromium.org/473803003 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23143 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/promise.js | 2 +- .../reject-caught-by-default-reject-handler.js | 6 ++-- .../throw-caught-by-default-reject-handler.js | 6 ++-- .../es6/debug-promises/throw-eventually-caught.js | 42 ++++++++++++++++++++++ 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 test/mjsunit/es6/debug-promises/throw-eventually-caught.js diff --git a/src/promise.js b/src/promise.js index cd96ec1..9e88aa5 100644 --- a/src/promise.js +++ b/src/promise.js @@ -332,7 +332,7 @@ var lastMicrotaskId = 0; // 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; + if (PromiseHasRejectHandlerRecursive(queue[i + 1].promise)) return true; } return false; } diff --git a/test/mjsunit/es6/debug-promises/reject-caught-by-default-reject-handler.js b/test/mjsunit/es6/debug-promises/reject-caught-by-default-reject-handler.js index 7760b0e..63151df 100644 --- a/test/mjsunit/es6/debug-promises/reject-caught-by-default-reject-handler.js +++ b/test/mjsunit/es6/debug-promises/reject-caught-by-default-reject-handler.js @@ -5,8 +5,10 @@ // Flags: --expose-debug-as debug --allow-natives-syntax // Test debug events when we only listen to uncaught exceptions and -// there is a catch handler for the to-be-rejected Promise. -// We expect an Exception debug event with a promise to be triggered. +// there is only a default reject handler for the to-be-rejected Promise. +// We expect two Exception debug events: +// - when the first Promise is rejected and only has default reject handlers. +// - when the default reject handler passes the rejection on. Debug = debug.Debug; diff --git a/test/mjsunit/es6/debug-promises/throw-caught-by-default-reject-handler.js b/test/mjsunit/es6/debug-promises/throw-caught-by-default-reject-handler.js index 89fc060..36b5565 100644 --- a/test/mjsunit/es6/debug-promises/throw-caught-by-default-reject-handler.js +++ b/test/mjsunit/es6/debug-promises/throw-caught-by-default-reject-handler.js @@ -5,8 +5,10 @@ // Flags: --expose-debug-as debug --allow-natives-syntax // Test debug events when we only listen to uncaught exceptions and -// there is a catch handler for the to-be-rejected Promise. -// We expect an Exception debug event with a promise to be triggered. +// there is only a default reject handler for the to-be-rejected Promise. +// We expect two Exception debug events: +// - when the first Promise is rejected and only has default reject handlers. +// - when the default reject handler passes the rejection on. Debug = debug.Debug; diff --git a/test/mjsunit/es6/debug-promises/throw-eventually-caught.js b/test/mjsunit/es6/debug-promises/throw-eventually-caught.js new file mode 100644 index 0000000..19610f7 --- /dev/null +++ b/test/mjsunit/es6/debug-promises/throw-eventually-caught.js @@ -0,0 +1,42 @@ +// Copyright 2014 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --expose-debug-as debug --allow-natives-syntax + +// Test debug events when we only listen to uncaught exceptions and +// there is a catch handler for the to-be-rejected Promise. +// We expect no Exception debug events, since the default reject handler passes +// the rejection on to a user-defined reject handler. + +Debug = debug.Debug; + +var resolve, reject; +var p0 = new Promise(function(res, rej) { resolve = res; reject = rej; }); + +var p1 = p0.then(function() { + throw new Error(); +}); + +var p2 = p1.then(function() { }); +var p3 = p2.catch(function() { }); + +var q = new Promise(function(res, rej) { + res(); +}); + +q.then(function() { + resolve(); +}) + + +function listener(event, exec_state, event_data, data) { + try { + assertTrue(event != Debug.DebugEvent.Exception); + } catch (e) { + %AbortJS(e + "\n" + e.stack); + } +} + +Debug.setBreakOnUncaughtException(); +Debug.setListener(listener); -- 2.7.4