|
1 | | -import { createReactiveSystem, ReactiveFlags, type Link, type ReactiveNode } from './system.js'; |
| 1 | +import { createReactiveSystem, ReactiveFlags, type ReactiveNode } from './system.js'; |
2 | 2 |
|
3 | 3 | interface EffectScopeNode extends ReactiveNode { |
4 | 4 | } |
@@ -74,13 +74,7 @@ const { |
74 | 74 | if ('getter' in node) { |
75 | 75 | if (node.depsTail !== undefined) { |
76 | 76 | node.flags = ReactiveFlags.Mutable | ReactiveFlags.Dirty; |
77 | | - let link: Link | undefined = node.depsTail; |
78 | | - node.depsTail = undefined; |
79 | | - while (link !== undefined) { |
80 | | - const prev: Link | undefined = link.prevDep; |
81 | | - unlink(link, node); |
82 | | - link = prev; |
83 | | - } |
| 77 | + disposeAllDepsInReverse(node); |
84 | 78 | } |
85 | 79 | } |
86 | 80 | else if ('currentValue' in node) { |
@@ -421,18 +415,22 @@ function effectOper(this: EffectNode): void { |
421 | 415 |
|
422 | 416 | function effectScopeOper(this: EffectScopeNode): void { |
423 | 417 | this.flags = ReactiveFlags.None; |
424 | | - let link = this.depsTail; |
425 | | - while (link !== undefined) { |
426 | | - const prev = link.prevDep; |
427 | | - unlink(link, this); |
428 | | - link = prev; |
429 | | - } |
| 418 | + disposeAllDepsInReverse(this); |
430 | 419 | const sub = this.subs; |
431 | 420 | if (sub !== undefined) { |
432 | 421 | unlink(sub); |
433 | 422 | } |
434 | 423 | } |
435 | 424 |
|
| 425 | +function disposeAllDepsInReverse(sub: ReactiveNode): void { |
| 426 | + let link = sub.depsTail; |
| 427 | + while (link !== undefined) { |
| 428 | + const prev = link.prevDep; |
| 429 | + unlink(link, sub); |
| 430 | + link = prev; |
| 431 | + } |
| 432 | +} |
| 433 | + |
436 | 434 | function purgeDeps(sub: ReactiveNode) { |
437 | 435 | const depsTail = sub.depsTail; |
438 | 436 | let dep = depsTail !== undefined ? depsTail.nextDep : sub.deps; |
|
0 commit comments