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());
}