Changeset 209455 in webkit


Ignore:
Timestamp:
Dec 7, 2016, 7:32:27 AM (9 years ago)
Author:
Yusuke Suzuki
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):

Location:
trunk/Source/JavaScriptCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r209442 r209455  
     12016-12-07  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        [JSC] Merge PromiseReactions
     4        https://bugs.webkit.org/show_bug.cgi?id=165526
     5
     6        Reviewed by Sam Weinig.
     7
     8        Our promise implementation has two arrays per Promise; promiseFulfillReactions and promiseRejectReactions.
     9        And everytime we call `promise.then`, we create two promise reactions for fullfill and reject.
     10        However, these two reactions and the arrays for reactions can be merged into one array and one reaction.
     11        It reduces the unnecessary object allocations.
     12
     13        No behavior change.
     14
     15        * builtins/BuiltinNames.h:
     16        * builtins/PromiseOperations.js:
     17        (globalPrivate.newPromiseReaction):
     18        (globalPrivate.triggerPromiseReactions):
     19        (globalPrivate.rejectPromise):
     20        (globalPrivate.fulfillPromise):
     21        (globalPrivate.promiseReactionJob):
     22        (globalPrivate.initializePromise):
     23        * builtins/PromisePrototype.js:
     24        (then):
     25        * runtime/JSPromise.cpp:
     26        (JSC::JSPromise::finishCreation):
     27
    1282016-12-06  Mark Lam  <mark.lam@apple.com>
    229
  • trunk/Source/JavaScriptCore/builtins/BuiltinNames.h

    r208953 r209455  
    8484    macro(templateRegistryKey) \
    8585    macro(enqueueJob) \
    86     macro(handler) \
    8786    macro(promiseState) \
    88     macro(promiseFulfillReactions) \
    89     macro(promiseRejectReactions) \
     87    macro(promiseReactions) \
    9088    macro(promiseResult) \
     89    macro(onFulfilled) \
     90    macro(onRejected) \
    9191    macro(push) \
    9292    macro(repeatCharacter) \
  • trunk/Source/JavaScriptCore/builtins/PromiseOperations.js

    r206853 r209455  
    3636
    3737@globalPrivate
    38 function newPromiseReaction(capability, handler)
     38function newPromiseReaction(capability, onFulfilled, onRejected)
    3939{
    4040    "use strict";
     
    4242    return {
    4343        @capabilities: capability,
    44         @handler: handler
     44        @onFulfilled: onFulfilled,
     45        @onRejected: onRejected,
    4546    };
    4647}
     
    8586
    8687@globalPrivate
    87 function triggerPromiseReactions(reactions, argument)
     88function triggerPromiseReactions(state, reactions, argument)
    8889{
    8990    "use strict";
    9091
    9192    for (var index = 0, length = reactions.length; index < length; ++index)
    92         @enqueueJob(@promiseReactionJob, [reactions[index], argument]);
     93        @enqueueJob(@promiseReactionJob, [state, reactions[index], argument]);
    9394}
    9495
     
    9899    "use strict";
    99100
    100     var reactions = promise.@promiseRejectReactions;
     101    var reactions = promise.@promiseReactions;
    101102    promise.@promiseResult = reason;
    102     promise.@promiseFulfillReactions = @undefined;
    103     promise.@promiseRejectReactions = @undefined;
     103    promise.@promiseReactions = @undefined;
    104104    promise.@promiseState = @promiseStateRejected;
    105105
    106106    @InspectorInstrumentation.promiseRejected(promise, reason, reactions);
    107107
    108     @triggerPromiseReactions(reactions, reason);
     108    @triggerPromiseReactions(@promiseStateRejected, reactions, reason);
    109109}
    110110
     
    114114    "use strict";
    115115
    116     var reactions = promise.@promiseFulfillReactions;
     116    var reactions = promise.@promiseReactions;
    117117    promise.@promiseResult = value;
    118     promise.@promiseFulfillReactions = @undefined;
    119     promise.@promiseRejectReactions = @undefined;
     118    promise.@promiseReactions = @undefined;
    120119    promise.@promiseState = @promiseStateFulfilled;
    121120
    122121    @InspectorInstrumentation.promiseFulfilled(promise, value, reactions);
    123122
    124     @triggerPromiseReactions(reactions, value);
     123    @triggerPromiseReactions(@promiseStateFulfilled, reactions, value);
    125124}
    126125
     
    173172
    174173@globalPrivate
    175 function promiseReactionJob(reaction, argument)
     174function promiseReactionJob(state, reaction, argument)
    176175{
    177176    "use strict";
     
    180179
    181180    var result;
     181    var handler = (state === @promiseStateFulfilled) ? reaction.@onFulfilled: reaction.@onRejected;
    182182    try {
    183         result = reaction.@handler.@call(@undefined, argument);
     183        result = handler(argument);
    184184    } catch (error) {
    185185        return promiseCapability.@reject.@call(@undefined, error);
     
    212212
    213213    this.@promiseState = @promiseStatePending;
    214     this.@promiseFulfillReactions = [];
    215     this.@promiseRejectReactions = [];
     214    this.@promiseReactions = [];
    216215
    217216    var resolvingFunctions = @createResolvingFunctions(this);
  • trunk/Source/JavaScriptCore/builtins/PromisePrototype.js

    r206853 r209455  
    4848        onRejected = function (argument) { throw argument; };
    4949
    50     var fulfillReaction = @newPromiseReaction(resultCapability, onFulfilled);
    51     var rejectReaction = @newPromiseReaction(resultCapability, onRejected);
     50    var reaction = @newPromiseReaction(resultCapability, onFulfilled, onRejected);
    5251
    5352    var state = this.@promiseState;
    54 
    55     if (state === @promiseStatePending) {
    56         @putByValDirect(this.@promiseFulfillReactions, this.@promiseFulfillReactions.length, fulfillReaction)
    57         @putByValDirect(this.@promiseRejectReactions, this.@promiseRejectReactions.length, rejectReaction)
    58     } else if (state === @promiseStateFulfilled)
    59         @enqueueJob(@promiseReactionJob, [fulfillReaction, this.@promiseResult]);
    60     else if (state === @promiseStateRejected)
    61         @enqueueJob(@promiseReactionJob, [rejectReaction, this.@promiseResult]);
     53    if (state === @promiseStatePending)
     54        @putByValDirect(this.@promiseReactions, this.@promiseReactions.length, reaction);
     55    else
     56        @enqueueJob(@promiseReactionJob, [state, reaction, this.@promiseResult]);
    6257
    6358    return resultCapability.@promise;
  • trunk/Source/JavaScriptCore/runtime/JSPromise.cpp

    r205462 r209455  
    5858    Base::finishCreation(vm);
    5959    putDirect(vm, vm.propertyNames->builtinNames().promiseStatePrivateName(), jsNumber(static_cast<unsigned>(Status::Pending)));
    60     putDirect(vm, vm.propertyNames->builtinNames().promiseFulfillReactionsPrivateName(), jsUndefined());
    61     putDirect(vm, vm.propertyNames->builtinNames().promiseRejectReactionsPrivateName(), jsUndefined());
     60    putDirect(vm, vm.propertyNames->builtinNames().promiseReactionsPrivateName(), jsUndefined());
    6261    putDirect(vm, vm.propertyNames->builtinNames().promiseResultPrivateName(), jsUndefined());
    6362}
Note: See TracChangeset for help on using the changeset viewer.