Title: [209455] trunk/Source/_javascript_Core
Revision
209455
Author
utatane....@gmail.com
Date
2016-12-07 07:32:27 -0800 (Wed, 07 Dec 2016)

Log Message

[JSC] Merge PromiseReactions
https://bugs.webkit.org/show_bug.cgi?id=165526

Reviewed by Sam Weinig.

Our promise implementation has two arrays per Promise; promiseFulfillReactions and promiseRejectReactions.
And everytime we call `promise.then`, we create two promise reactions for fullfill and reject.
However, these two reactions and the arrays for reactions can be merged into one array and one reaction.
It reduces the unnecessary object allocations.

No behavior change.

* builtins/BuiltinNames.h:
* builtins/PromiseOperations.js:
(globalPrivate.newPromiseReaction):
(globalPrivate.triggerPromiseReactions):
(globalPrivate.rejectPromise):
(globalPrivate.fulfillPromise):
(globalPrivate.promiseReactionJob):
(globalPrivate.initializePromise):
* builtins/PromisePrototype.js:
(then):
* runtime/JSPromise.cpp:
(JSC::JSPromise::finishCreation):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (209454 => 209455)


--- trunk/Source/_javascript_Core/ChangeLog	2016-12-07 13:38:57 UTC (rev 209454)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-12-07 15:32:27 UTC (rev 209455)
@@ -1,3 +1,30 @@
+2016-12-07  Yusuke Suzuki  <utatane....@gmail.com>
+
+        [JSC] Merge PromiseReactions
+        https://bugs.webkit.org/show_bug.cgi?id=165526
+
+        Reviewed by Sam Weinig.
+
+        Our promise implementation has two arrays per Promise; promiseFulfillReactions and promiseRejectReactions.
+        And everytime we call `promise.then`, we create two promise reactions for fullfill and reject.
+        However, these two reactions and the arrays for reactions can be merged into one array and one reaction.
+        It reduces the unnecessary object allocations.
+
+        No behavior change.
+
+        * builtins/BuiltinNames.h:
+        * builtins/PromiseOperations.js:
+        (globalPrivate.newPromiseReaction):
+        (globalPrivate.triggerPromiseReactions):
+        (globalPrivate.rejectPromise):
+        (globalPrivate.fulfillPromise):
+        (globalPrivate.promiseReactionJob):
+        (globalPrivate.initializePromise):
+        * builtins/PromisePrototype.js:
+        (then):
+        * runtime/JSPromise.cpp:
+        (JSC::JSPromise::finishCreation):
+
 2016-12-06  Mark Lam  <mark....@apple.com>
 
         GetByID IC is wrongly unwrapping the global proxy this value for getter/setters.

Modified: trunk/Source/_javascript_Core/builtins/BuiltinNames.h (209454 => 209455)


--- trunk/Source/_javascript_Core/builtins/BuiltinNames.h	2016-12-07 13:38:57 UTC (rev 209454)
+++ trunk/Source/_javascript_Core/builtins/BuiltinNames.h	2016-12-07 15:32:27 UTC (rev 209455)
@@ -83,11 +83,11 @@
     macro(getTemplateObject) \
     macro(templateRegistryKey) \
     macro(enqueueJob) \
-    macro(handler) \
     macro(promiseState) \
-    macro(promiseFulfillReactions) \
-    macro(promiseRejectReactions) \
+    macro(promiseReactions) \
     macro(promiseResult) \
+    macro(onFulfilled) \
+    macro(onRejected) \
     macro(push) \
     macro(repeatCharacter) \
     macro(capabilities) \

Modified: trunk/Source/_javascript_Core/builtins/PromiseOperations.js (209454 => 209455)


--- trunk/Source/_javascript_Core/builtins/PromiseOperations.js	2016-12-07 13:38:57 UTC (rev 209454)
+++ trunk/Source/_javascript_Core/builtins/PromiseOperations.js	2016-12-07 15:32:27 UTC (rev 209455)
@@ -35,13 +35,14 @@
 }
 
 @globalPrivate
-function newPromiseReaction(capability, handler)
+function newPromiseReaction(capability, onFulfilled, onRejected)
 {
     "use strict";
 
     return {
         @capabilities: capability,
-        @handler: handler
+        @onFulfilled: onFulfilled,
+        @onRejected: onRejected,
     };
 }
 
@@ -84,12 +85,12 @@
 }
 
 @globalPrivate
-function triggerPromiseReactions(reactions, argument)
+function triggerPromiseReactions(state, reactions, argument)
 {
     "use strict";
 
     for (var index = 0, length = reactions.length; index < length; ++index)
-        @enqueueJob(@promiseReactionJob, [reactions[index], argument]);
+        @enqueueJob(@promiseReactionJob, [state, reactions[index], argument]);
 }
 
 @globalPrivate
@@ -97,15 +98,14 @@
 {
     "use strict";
 
-    var reactions = promise.@promiseRejectReactions;
+    var reactions = promise.@promiseReactions;
     promise.@promiseResult = reason;
-    promise.@promiseFulfillReactions = @undefined;
-    promise.@promiseRejectReactions = @undefined;
+    promise.@promiseReactions = @undefined;
     promise.@promiseState = @promiseStateRejected;
 
     @InspectorInstrumentation.promiseRejected(promise, reason, reactions);
 
-    @triggerPromiseReactions(reactions, reason);
+    @triggerPromiseReactions(@promiseStateRejected, reactions, reason);
 }
 
 @globalPrivate
@@ -113,15 +113,14 @@
 {
     "use strict";
 
-    var reactions = promise.@promiseFulfillReactions;
+    var reactions = promise.@promiseReactions;
     promise.@promiseResult = value;
-    promise.@promiseFulfillReactions = @undefined;
-    promise.@promiseRejectReactions = @undefined;
+    promise.@promiseReactions = @undefined;
     promise.@promiseState = @promiseStateFulfilled;
 
     @InspectorInstrumentation.promiseFulfilled(promise, value, reactions);
 
-    @triggerPromiseReactions(reactions, value);
+    @triggerPromiseReactions(@promiseStateFulfilled, reactions, value);
 }
 
 @globalPrivate
@@ -172,7 +171,7 @@
 }
 
 @globalPrivate
-function promiseReactionJob(reaction, argument)
+function promiseReactionJob(state, reaction, argument)
 {
     "use strict";
 
@@ -179,8 +178,9 @@
     var promiseCapability = reaction.@capabilities;
 
     var result;
+    var handler = (state === @promiseStateFulfilled) ? reaction.@onFulfilled: reaction.@onRejected;
     try {
-        result = reaction.@handler.@call(@undefined, argument);
+        result = handler(argument);
     } catch (error) {
         return promiseCapability.@reject.@call(@undefined, error);
     }
@@ -211,8 +211,7 @@
         @throwTypeError("Promise constructor takes a function argument");
 
     this.@promiseState = @promiseStatePending;
-    this.@promiseFulfillReactions = [];
-    this.@promiseRejectReactions = [];
+    this.@promiseReactions = [];
 
     var resolvingFunctions = @createResolvingFunctions(this);
     try {

Modified: trunk/Source/_javascript_Core/builtins/PromisePrototype.js (209454 => 209455)


--- trunk/Source/_javascript_Core/builtins/PromisePrototype.js	2016-12-07 13:38:57 UTC (rev 209454)
+++ trunk/Source/_javascript_Core/builtins/PromisePrototype.js	2016-12-07 15:32:27 UTC (rev 209455)
@@ -47,18 +47,13 @@
     if (typeof onRejected !== "function")
         _onRejected_ = function (argument) { throw argument; };
 
-    var fulfillReaction = @newPromiseReaction(resultCapability, onFulfilled);
-    var rejectReaction = @newPromiseReaction(resultCapability, onRejected);
+    var reaction = @newPromiseReaction(resultCapability, onFulfilled, onRejected);
 
     var state = this.@promiseState;
+    if (state === @promiseStatePending)
+        @putByValDirect(this.@promiseReactions, this.@promiseReactions.length, reaction);
+    else
+        @enqueueJob(@promiseReactionJob, [state, reaction, this.@promiseResult]);
 
-    if (state === @promiseStatePending) {
-        @putByValDirect(this.@promiseFulfillReactions, this.@promiseFulfillReactions.length, fulfillReaction)
-        @putByValDirect(this.@promiseRejectReactions, this.@promiseRejectReactions.length, rejectReaction)
-    } else if (state === @promiseStateFulfilled)
-        @enqueueJob(@promiseReactionJob, [fulfillReaction, this.@promiseResult]);
-    else if (state === @promiseStateRejected)
-        @enqueueJob(@promiseReactionJob, [rejectReaction, this.@promiseResult]);
-
     return resultCapability.@promise;
 }

Modified: trunk/Source/_javascript_Core/runtime/JSPromise.cpp (209454 => 209455)


--- trunk/Source/_javascript_Core/runtime/JSPromise.cpp	2016-12-07 13:38:57 UTC (rev 209454)
+++ trunk/Source/_javascript_Core/runtime/JSPromise.cpp	2016-12-07 15:32:27 UTC (rev 209455)
@@ -57,8 +57,7 @@
 {
     Base::finishCreation(vm);
     putDirect(vm, vm.propertyNames->builtinNames().promiseStatePrivateName(), jsNumber(static_cast<unsigned>(Status::Pending)));
-    putDirect(vm, vm.propertyNames->builtinNames().promiseFulfillReactionsPrivateName(), jsUndefined());
-    putDirect(vm, vm.propertyNames->builtinNames().promiseRejectReactionsPrivateName(), jsUndefined());
+    putDirect(vm, vm.propertyNames->builtinNames().promiseReactionsPrivateName(), jsUndefined());
     putDirect(vm, vm.propertyNames->builtinNames().promiseResultPrivateName(), jsUndefined());
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to