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

Unified Diff: src/js/promise.js

Issue 2244003003: Change which ExceptionEvents are triggered by Promises (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix expected #args Created 4 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
« no previous file with comments | « no previous file | src/runtime/runtime.h » ('j') | src/runtime/runtime-internal.cc » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/js/promise.js
diff --git a/src/js/promise.js b/src/js/promise.js
index b50fc80b305bdcfd509e479cfb703171b85eac9b..34cf784581fc325aa55c66e3c5faf77ec35083af 100644
--- a/src/js/promise.js
+++ b/src/js/promise.js
@@ -44,7 +44,7 @@ var lastMicrotaskId = 0;
// ES#sec-createresolvingfunctions
// CreateResolvingFunctions ( promise )
-function CreateResolvingFunctions(promise) {
+function CreateResolvingFunctions(promise, suppressDebugEvent) {
var alreadyResolved = false;
// ES#sec-promise-resolve-functions
@@ -60,7 +60,7 @@ function CreateResolvingFunctions(promise) {
var reject = reason => {
if (alreadyResolved === true) return;
alreadyResolved = true;
- RejectPromise(promise, reason);
+ RejectPromise(promise, reason, suppressDebugEvent);
};
return {
@@ -268,7 +268,7 @@ function ResolvePromise(promise, resolution) {
// Revoke previously triggered reject event.
%PromiseRevokeReject(resolution);
}
- RejectPromise(promise, thenableValue);
+ RejectPromise(promise, thenableValue, true);
SET_PRIVATE(resolution, promiseHasHandlerSymbol, true);
return;
}
@@ -283,7 +283,7 @@ function ResolvePromise(promise, resolution) {
if (instrumenting) {
%DebugAsyncTaskEvent({ type: "willHandle", id: id, name: name });
}
- var callbacks = CreateResolvingFunctions(promise);
+ var callbacks = CreateResolvingFunctions(promise, true);
try {
%_Call(then, resolution, callbacks.resolve, callbacks.reject);
} catch (e) {
@@ -305,14 +305,14 @@ function ResolvePromise(promise, resolution) {
// ES#sec-rejectpromise
// RejectPromise ( promise, reason )
-function RejectPromise(promise, reason) {
+function RejectPromise(promise, reason, suppressDebugEvent) {
adamk 2016/08/23 22:29:27 It's confusing to me that %PromiseRejectEvent take
Dan Ehrenberg 2016/08/23 23:28:38 Good point. Switched it to debugEvent as a positiv
// Check promise status to confirm that this reject has an effect.
// Call runtime for callbacks to the debugger or for unhandled reject.
if (GET_PRIVATE(promise, promiseStateSymbol) === kPending) {
- var debug_is_active = DEBUG_IS_ACTIVE;
- if (debug_is_active ||
+ var debugEvent = DEBUG_IS_ACTIVE && !suppressDebugEvent
+ if (debugEvent ||
!HAS_DEFINED_PRIVATE(promise, promiseHasHandlerSymbol)) {
- %PromiseRejectEvent(promise, reason, debug_is_active);
+ %PromiseRejectEvent(promise, reason, debugEvent, false);
}
}
FulfillPromise(promise, kRejected, reason, promiseRejectReactionsSymbol)
@@ -320,11 +320,11 @@ function RejectPromise(promise, reason) {
// ES#sec-newpromisecapability
// NewPromiseCapability ( C )
-function NewPromiseCapability(C) {
+function NewPromiseCapability(C, suppressDebugEvent) {
if (C === GlobalPromise) {
// Optimized case, avoid extra closure.
var promise = PromiseInit(new GlobalPromise(promiseRawSymbol));
- var callbacks = CreateResolvingFunctions(promise);
+ var callbacks = CreateResolvingFunctions(promise, suppressDebugEvent);
return {
promise: promise,
resolve: callbacks.resolve,
@@ -355,9 +355,9 @@ function PromiseReject(r) {
if (this === GlobalPromise) {
// Optimized case, avoid extra closure.
var promise = PromiseCreateAndSet(kRejected, r);
- // The debug event for this would always be an uncaught promise reject,
- // which is usually simply noise. Do not trigger that debug event.
- %PromiseRejectEvent(promise, r, false);
+ // Trigger debug events if the debugger is on, as Promise.reject is
+ // equivalent to throwing an exception directly.
+ %PromiseRejectEvent(promise, r, DEBUG_IS_ACTIVE, true);
return promise;
} else {
var promiseCapability = NewPromiseCapability(this);
@@ -369,7 +369,11 @@ function PromiseReject(r) {
// Shortcut Promise.reject and Promise.resolve() implementations, used by
// Async Functions implementation.
function PromiseCreateRejected(r) {
- return %_Call(PromiseReject, GlobalPromise, r);
+ var promise = PromiseCreateAndSet(kRejected, r);
+ // This is called from the desugaring of async/await; no reason to
+ // create a redundant reject event.
+ %PromiseRejectEvent(promise, r, false, false);
adamk 2016/08/23 22:29:27 Passing two bools is not ideal, see suggestion in
Dan Ehrenberg 2016/08/23 23:28:38 Fixed, now separated out a different function.
+ return promise;
}
function PromiseCreateResolved(value) {
@@ -427,7 +431,7 @@ function PromiseThen(onResolve, onReject) {
}
var constructor = SpeciesConstructor(this, GlobalPromise);
- var resultCapability = NewPromiseCapability(constructor);
+ var resultCapability = NewPromiseCapability(constructor, true);
return PerformPromiseThen(this, onResolve, onReject, resultCapability);
}
« no previous file with comments | « no previous file | src/runtime/runtime.h » ('j') | src/runtime/runtime-internal.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698