2626
2727// @internal
2828
29- @linkTimeConstant
30- function pushNewPromiseReaction ( thenable , existingReactions , promiseOrCapability , onFulfilled , onRejected , context )
31- {
32- "use strict" ;
33- var asyncContext = @getInternalField ( @asyncContext , 0 ) ;
34- if ( ! existingReactions ) {
35- existingReactions = {
36- @promiseOrCapability : promiseOrCapability ,
37- @onFulfilled : onFulfilled ,
38- @onRejected : onRejected ,
39- @context : asyncContext ? [ context , asyncContext ] : context ,
40- // This is 4x the number of out of line reactions (promise, fulfill callback, reject callback, context).
41- @outOfLineReactionCounts : 0 ,
42- } ;
43- @putPromiseInternalField ( thenable , @promiseFieldReactionsOrResult , existingReactions ) ;
44- } else {
45- var outOfLineReactionCounts = existingReactions . @outOfLineReactionCounts ;
46- @putByValDirect ( existingReactions , outOfLineReactionCounts ++ , promiseOrCapability ) ;
47- @putByValDirect ( existingReactions , outOfLineReactionCounts ++ , onFulfilled ) ;
48- @putByValDirect ( existingReactions , outOfLineReactionCounts ++ , onRejected ) ;
49- @putByValDirect ( existingReactions , outOfLineReactionCounts ++ , asyncContext ? [ context , asyncContext ] : context ) ;
50- existingReactions . @outOfLineReactionCounts = outOfLineReactionCounts ;
51- }
52- }
53-
5429@linkTimeConstant
5530function newPromiseCapabilitySlow ( constructor )
5631{
@@ -160,18 +135,27 @@ function triggerPromiseReactions(state, reactions, argument)
160135 if ( ! reactions )
161136 return ;
162137
163- var isResolved = state === @promiseStateFulfilled ;
164- var handler = isResolved ? reactions . @onFulfilled : reactions . @onRejected ;
138+ // Reverse the order of singly-linked-list.
139+ var previous = @undefined ;
140+ var current = reactions ;
141+ while ( current ) {
142+ var next = @getPromiseReactionInternalField ( current , @promiseReactionFieldNext ) ;
143+ @putPromiseReactionInternalField ( current , @promiseReactionFieldNext , previous ) ;
144+ previous = current ;
145+ current = next ;
146+ }
147+ reactions = previous ;
165148
166- @ enqueueJob ( @ promiseReactionJob , reactions . @ promiseOrCapability , handler , argument , handler ? reactions . @ context : state ) ;
149+ var isResolved = state === @ promiseStateFulfilled ;
167150
168- for ( var i = 0 , count = reactions . @outOfLineReactionCounts ; i < count ; i += 4 ) {
169- var promise = reactions [ i ] ;
170- var handler = isResolved ? reactions [ i + 1 ] : reactions [ i + 2 ] ;
171- var context = reactions [ i + 3 ] ;
151+ current = reactions ;
152+ while ( current ) {
153+ var promise = @getPromiseReactionInternalField ( current , @promiseReactionFieldPromise ) ;
154+ var handler = isResolved ? @getPromiseReactionInternalField ( current , @promiseReactionFieldOnFulfilled ) : @getPromiseReactionInternalField ( current , @promiseReactionFieldOnRejected ) ;
155+ var context = @getPromiseReactionInternalField ( current , @promiseReactionFieldContext ) ;
156+ current = @getPromiseReactionInternalField ( current , @promiseReactionFieldNext ) ;
172157 @enqueueJob ( @promiseReactionJob , promise , handler , argument , handler ? context : state ) ;
173158 }
174- @assert ( i === count ) ;
175159}
176160
177161@linkTimeConstant
@@ -570,7 +554,7 @@ function promiseResolveThenableJobFast(thenable, promiseToResolve)
570554 var state = flags & @promiseStateMask ;
571555 var reactionsOrResult = @getPromiseInternalField ( thenable , @promiseFieldReactionsOrResult ) ;
572556 if ( state === @promiseStatePending )
573- @pushNewPromiseReaction ( thenable , reactionsOrResult , promiseToResolve , @undefined , @undefined ) ;
557+ @putPromiseInternalField ( thenable , @ promiseFieldReactionsOrResult , @ promiseReactionCreate ( promiseToResolve , @undefined , @undefined , @ undefined , reactionsOrResult ) ) ;
574558 else {
575559 if ( state === @promiseStateRejected && ! ( flags & @promiseFlagsIsHandled ) )
576560 @hostPromiseRejectionTracker ( thenable , @promiseRejectionHandle ) ;
@@ -602,9 +586,12 @@ function promiseResolveThenableJobWithoutPromiseFast(thenable, onFulfilled, onRe
602586 var flags = @getPromiseInternalField ( thenable , @promiseFieldFlags ) ;
603587 var state = flags & @promiseStateMask ;
604588 var reactionsOrResult = @getPromiseInternalField ( thenable , @promiseFieldReactionsOrResult ) ;
605- if ( state === @promiseStatePending )
606- @pushNewPromiseReaction ( thenable , reactionsOrResult , @undefined , onFulfilled , onRejected , context ) ;
607- else {
589+ if ( state === @promiseStatePending ) {
590+ var asyncContext = @getInternalField ( @asyncContext , 0 ) ;
591+ if ( asyncContext )
592+ context = [ context , asyncContext ] ;
593+ @putPromiseInternalField ( thenable , @promiseFieldReactionsOrResult , @promiseReactionCreate ( @undefined , onFulfilled , onRejected , context , reactionsOrResult ) ) ;
594+ } else {
608595 if ( state === @promiseStateRejected ) {
609596 if ( ! ( flags & @promiseFlagsIsHandled ) )
610597 @hostPromiseRejectionTracker ( thenable , @promiseRejectionHandle ) ;
@@ -693,6 +680,7 @@ function promiseEmptyOnRejected(argument)
693680}
694681
695682@linkTimeConstant
683+ @alwaysInline
696684function performPromiseThen ( promise , onFulfilled , onRejected , promiseOrCapability , context )
697685{
698686 "use strict" ;
@@ -706,9 +694,12 @@ function performPromiseThen(promise, onFulfilled, onRejected, promiseOrCapabilit
706694 var reactionsOrResult = @getPromiseInternalField ( promise , @promiseFieldReactionsOrResult ) ;
707695 var flags = @getPromiseInternalField ( promise , @promiseFieldFlags ) ;
708696 var state = flags & @promiseStateMask ;
709- if ( state === @promiseStatePending )
710- @pushNewPromiseReaction ( promise , reactionsOrResult , promiseOrCapability , onFulfilled , onRejected , context ) ;
711- else {
697+ if ( state === @promiseStatePending ) {
698+ var asyncContext = @getInternalField ( @asyncContext , 0 ) ;
699+ if ( asyncContext )
700+ context = [ context , asyncContext ] ;
701+ @putPromiseInternalField ( promise , @promiseFieldReactionsOrResult , @promiseReactionCreate ( promiseOrCapability , onFulfilled , onRejected , context , reactionsOrResult ) ) ;
702+ } else {
712703 var handler ;
713704
714705 if ( state === @promiseStateRejected ) {
0 commit comments