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

Unified Diff: src/js/promise.js

Issue 2451163003: [promises] Move PromiseReject to c++ (Closed)
Patch Set: make promise a jsobject Created 4 years, 2 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 | « src/js/async-await.js ('k') | src/runtime/runtime.h » ('j') | no next file with comments »
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 93758caf9513b4bb3db8889ef6cf44cd0d750ca8..75ec6e1c57683f56c9107e5f8754590b532c46d3 100644
--- a/src/js/promise.js
+++ b/src/js/promise.js
@@ -44,9 +44,10 @@ utils.Import(function(from) {
// -------------------------------------------------------------------
// [[PromiseState]] values:
+// These values should be kept in sync with PromiseStatus in globals.h
const kPending = 0;
const kFulfilled = +1;
-const kRejected = -1;
+const kRejected = +2;
// ES#sec-createresolvingfunctions
// CreateResolvingFunctions ( promise )
@@ -66,7 +67,8 @@ function CreateResolvingFunctions(promise, debugEvent) {
var reject = reason => {
if (alreadyResolved === true) return;
alreadyResolved = true;
- RejectPromise(promise, reason, debugEvent);
+ %PromiseReject(promise, reason, debugEvent);
+ PromiseSet(promise, kRejected, reason);
};
return {
@@ -157,7 +159,8 @@ function PromiseHandle(value, handler, deferred) {
if (IS_UNDEFINED(deferred.reject)) {
// Pass false for debugEvent so .then chaining does not trigger
// redundant ExceptionEvents.
- RejectPromise(deferred.promise, exception, false);
+ %PromiseReject(deferred.promise, exception, false);
+ PromiseSet(deferred.promise, kRejected, exception);
} else {
%_Call(deferred.reject, UNDEFINED, exception);
}
@@ -243,16 +246,19 @@ function PromiseCreate() {
// Promise Resolve Functions, steps 6-13
function ResolvePromise(promise, resolution) {
if (resolution === promise) {
- return RejectPromise(promise,
- %make_type_error(kPromiseCyclic, resolution),
- true);
+ var exception = %make_type_error(kPromiseCyclic, resolution);
+ %PromiseReject(promise, exception, true);
+ PromiseSet(promise, kRejected, exception);
+ return;
}
if (IS_RECEIVER(resolution)) {
// 25.4.1.3.2 steps 8-12
try {
var then = resolution.then;
} catch (e) {
- return RejectPromise(promise, e, true);
+ %PromiseReject(promise, e, true);
+ PromiseSet(promise, kRejected, e);
+ return;
}
// Resolution is a native promise and if it's already resolved or
@@ -277,7 +283,8 @@ function ResolvePromise(promise, resolution) {
%PromiseRevokeReject(resolution);
}
// Don't cause a debug event as this case is forwarding a rejection
- RejectPromise(promise, thenableValue, false);
+ %PromiseReject(promise, thenableValue, false);
+ PromiseSet(promise, kRejected, thenableValue);
SET_PRIVATE(resolution, promiseHasHandlerSymbol, true);
return;
}
@@ -299,26 +306,16 @@ function ResolvePromise(promise, resolution) {
PromiseSet(promise, kFulfilled, resolution);
}
-// ES#sec-rejectpromise
-// RejectPromise ( promise, reason )
-function RejectPromise(promise, reason, debugEvent) {
- // Call runtime for callbacks to the debugger or for unhandled reject.
- // The debugEvent parameter sets whether a debug ExceptionEvent should
- // be triggered. It should be set to false when forwarding a rejection
- // rather than creating a new one.
- // This check is redundant with checks in the runtime, but it may help
- // avoid unnecessary runtime calls.
- if ((debugEvent && DEBUG_IS_ACTIVE) ||
- !HAS_DEFINED_PRIVATE(promise, promiseHasHandlerSymbol)) {
- %PromiseRejectEvent(promise, reason, debugEvent);
- }
- %PromiseFulfill(promise, kRejected, reason, promiseRejectReactionsSymbol)
+// Only used by async-await.js
+function RejectPromise(promise, reason) {
+ %PromiseReject(promise, reason, false);
PromiseSet(promise, kRejected, reason);
}
// Export to bindings
function DoRejectPromise(promise, reason) {
- return RejectPromise(promise, reason, true);
+ %PromiseReject(promise, reason, true);
+ PromiseSet(promise, kRejected, reason);
}
// ES#sec-newpromisecapability
« no previous file with comments | « src/js/async-await.js ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698