@@ -74,52 +74,43 @@ export function link(dep: Dependency, sub: Subscriber): Link | undefined {
74
74
return linkNewDep ( dep , sub , nextDep , currentDep )
75
75
}
76
76
77
- export function propagate ( current : Link ) : void {
78
- let next = current . nextSub
79
- let branchs : OneWayLink < Link | undefined > | undefined
80
- let branchDepth = 0
77
+ export function propagate ( link : Link ) : void {
81
78
let targetFlag = SubscriberFlags . Dirty
79
+ let subs = link
80
+ let stack = 0
82
81
83
82
top: do {
84
- const sub = current . sub
83
+ const sub = link . sub
85
84
const subFlags = sub . flags
86
85
87
- let shouldNotify = false
88
-
89
86
if (
90
- ! (
87
+ ( ! (
91
88
subFlags &
92
89
( SubscriberFlags . Tracking |
93
90
SubscriberFlags . Recursed |
94
91
SubscriberFlags . Propagated )
95
- )
96
- ) {
97
- sub . flags = subFlags | targetFlag
98
- shouldNotify = true
99
- } else if (
100
- subFlags & SubscriberFlags . Recursed &&
101
- ! ( subFlags & SubscriberFlags . Tracking )
92
+ ) &&
93
+ ( ( sub . flags = subFlags | targetFlag ) , true ) ) ||
94
+ ( subFlags & SubscriberFlags . Recursed &&
95
+ ! ( subFlags & SubscriberFlags . Tracking ) &&
96
+ ( ( sub . flags = ( subFlags & ~ SubscriberFlags . Recursed ) | targetFlag ) ,
97
+ true ) ) ||
98
+ ( ! ( subFlags & SubscriberFlags . Propagated ) &&
99
+ isValidLink ( link , sub ) &&
100
+ ( ( sub . flags = subFlags | SubscriberFlags . Recursed | targetFlag ) ,
101
+ ( sub as Dependency ) . subs !== undefined ) )
102
102
) {
103
- sub . flags = ( subFlags & ~ SubscriberFlags . Recursed ) | targetFlag
104
- shouldNotify = true
105
- } else if (
106
- ! ( subFlags & SubscriberFlags . Propagated ) &&
107
- isValidLink ( current , sub )
108
- ) {
109
- sub . flags = subFlags | SubscriberFlags . Recursed | targetFlag
110
- shouldNotify = ( sub as Dependency ) . subs !== undefined
111
- }
112
-
113
- if ( shouldNotify ) {
114
103
const subSubs = ( sub as Dependency ) . subs
115
104
if ( subSubs !== undefined ) {
116
- current = subSubs
117
105
if ( subSubs . nextSub !== undefined ) {
118
- branchs = { target : next , linked : branchs }
119
- ++ branchDepth
120
- next = current . nextSub
106
+ subSubs . prevSub = subs
107
+ link = subs = subSubs
108
+ targetFlag = SubscriberFlags . PendingComputed
109
+ ++ stack
110
+ } else {
111
+ link = subSubs
112
+ targetFlag = SubscriberFlags . PendingComputed
121
113
}
122
- targetFlag = SubscriberFlags . PendingComputed
123
114
continue
124
115
}
125
116
if ( subFlags & SubscriberFlags . Effect ) {
@@ -130,25 +121,28 @@ export function propagate(current: Link): void {
130
121
} else if (
131
122
! ( subFlags & targetFlag ) &&
132
123
subFlags & SubscriberFlags . Propagated &&
133
- isValidLink ( current , sub )
124
+ isValidLink ( link , sub )
134
125
) {
135
126
sub . flags = subFlags | targetFlag
136
127
}
137
128
138
- if ( ( current = next ! ) !== undefined ) {
139
- next = current . nextSub
140
- targetFlag = branchDepth
129
+ if ( ( link = subs . nextSub ! ) !== undefined ) {
130
+ subs = link
131
+ targetFlag = stack
141
132
? SubscriberFlags . PendingComputed
142
133
: SubscriberFlags . Dirty
143
134
continue
144
135
}
145
136
146
- while ( branchDepth -- ) {
147
- current = branchs ! . target !
148
- branchs = branchs ! . linked
149
- if ( current !== undefined ) {
150
- next = current . nextSub
151
- targetFlag = branchDepth
137
+ while ( stack ) {
138
+ -- stack
139
+ const dep = subs . dep
140
+ const depSubs = dep . subs !
141
+ subs = depSubs . prevSub !
142
+ depSubs . prevSub = undefined
143
+ if ( ( link = subs . nextSub ! ) !== undefined ) {
144
+ subs = link
145
+ targetFlag = stack
152
146
? SubscriberFlags . PendingComputed
153
147
: SubscriberFlags . Dirty
154
148
continue top
0 commit comments