Changeset 209455 in webkit
- Timestamp:
- Dec 7, 2016, 7:32:27 AM (9 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r209442 r209455 1 2016-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 1 28 2016-12-06 Mark Lam <mark.lam@apple.com> 2 29 -
trunk/Source/JavaScriptCore/builtins/BuiltinNames.h
r208953 r209455 84 84 macro(templateRegistryKey) \ 85 85 macro(enqueueJob) \ 86 macro(handler) \87 86 macro(promiseState) \ 88 macro(promiseFulfillReactions) \ 89 macro(promiseRejectReactions) \ 87 macro(promiseReactions) \ 90 88 macro(promiseResult) \ 89 macro(onFulfilled) \ 90 macro(onRejected) \ 91 91 macro(push) \ 92 92 macro(repeatCharacter) \ -
trunk/Source/JavaScriptCore/builtins/PromiseOperations.js
r206853 r209455 36 36 37 37 @globalPrivate 38 function newPromiseReaction(capability, handler)38 function newPromiseReaction(capability, onFulfilled, onRejected) 39 39 { 40 40 "use strict"; … … 42 42 return { 43 43 @capabilities: capability, 44 @handler: handler 44 @onFulfilled: onFulfilled, 45 @onRejected: onRejected, 45 46 }; 46 47 } … … 85 86 86 87 @globalPrivate 87 function triggerPromiseReactions( reactions, argument)88 function triggerPromiseReactions(state, reactions, argument) 88 89 { 89 90 "use strict"; 90 91 91 92 for (var index = 0, length = reactions.length; index < length; ++index) 92 @enqueueJob(@promiseReactionJob, [ reactions[index], argument]);93 @enqueueJob(@promiseReactionJob, [state, reactions[index], argument]); 93 94 } 94 95 … … 98 99 "use strict"; 99 100 100 var reactions = promise.@promiseRe jectReactions;101 var reactions = promise.@promiseReactions; 101 102 promise.@promiseResult = reason; 102 promise.@promiseFulfillReactions = @undefined; 103 promise.@promiseRejectReactions = @undefined; 103 promise.@promiseReactions = @undefined; 104 104 promise.@promiseState = @promiseStateRejected; 105 105 106 106 @InspectorInstrumentation.promiseRejected(promise, reason, reactions); 107 107 108 @triggerPromiseReactions( reactions, reason);108 @triggerPromiseReactions(@promiseStateRejected, reactions, reason); 109 109 } 110 110 … … 114 114 "use strict"; 115 115 116 var reactions = promise.@promise FulfillReactions;116 var reactions = promise.@promiseReactions; 117 117 promise.@promiseResult = value; 118 promise.@promiseFulfillReactions = @undefined; 119 promise.@promiseRejectReactions = @undefined; 118 promise.@promiseReactions = @undefined; 120 119 promise.@promiseState = @promiseStateFulfilled; 121 120 122 121 @InspectorInstrumentation.promiseFulfilled(promise, value, reactions); 123 122 124 @triggerPromiseReactions( reactions, value);123 @triggerPromiseReactions(@promiseStateFulfilled, reactions, value); 125 124 } 126 125 … … 173 172 174 173 @globalPrivate 175 function promiseReactionJob( reaction, argument)174 function promiseReactionJob(state, reaction, argument) 176 175 { 177 176 "use strict"; … … 180 179 181 180 var result; 181 var handler = (state === @promiseStateFulfilled) ? reaction.@onFulfilled: reaction.@onRejected; 182 182 try { 183 result = reaction.@handler.@call(@undefined,argument);183 result = handler(argument); 184 184 } catch (error) { 185 185 return promiseCapability.@reject.@call(@undefined, error); … … 212 212 213 213 this.@promiseState = @promiseStatePending; 214 this.@promiseFulfillReactions = []; 215 this.@promiseRejectReactions = []; 214 this.@promiseReactions = []; 216 215 217 216 var resolvingFunctions = @createResolvingFunctions(this); -
trunk/Source/JavaScriptCore/builtins/PromisePrototype.js
r206853 r209455 48 48 onRejected = function (argument) { throw argument; }; 49 49 50 var fulfillReaction = @newPromiseReaction(resultCapability, onFulfilled); 51 var rejectReaction = @newPromiseReaction(resultCapability, onRejected); 50 var reaction = @newPromiseReaction(resultCapability, onFulfilled, onRejected); 52 51 53 52 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]); 62 57 63 58 return resultCapability.@promise; -
trunk/Source/JavaScriptCore/runtime/JSPromise.cpp
r205462 r209455 58 58 Base::finishCreation(vm); 59 59 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()); 62 61 putDirect(vm, vm.propertyNames->builtinNames().promiseResultPrivateName(), jsUndefined()); 63 62 }
Note:
See TracChangeset
for help on using the changeset viewer.