Skip to content

Commit 4f95abf

Browse files
committed
process effect roots in tree order
1 parent 181fb2a commit 4f95abf

File tree

2 files changed

+14
-13
lines changed

2 files changed

+14
-13
lines changed

packages/svelte/src/internal/client/reactivity/effects.js

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ function push_effect(effect, parent_effect) {
8282
* @returns {Effect}
8383
*/
8484
function create_effect(type, fn, sync, push = true) {
85-
var is_root = (type & ROOT_EFFECT) !== 0;
8685
var parent_effect = active_effect;
8786

8887
if (DEV) {
@@ -103,7 +102,7 @@ function create_effect(type, fn, sync, push = true) {
103102
fn,
104103
last: null,
105104
next: null,
106-
parent: is_root ? null : parent_effect,
105+
parent: parent_effect,
107106
prev: null,
108107
teardown: null,
109108
transitions: null,
@@ -136,7 +135,7 @@ function create_effect(type, fn, sync, push = true) {
136135
effect.teardown === null &&
137136
(effect.f & (EFFECT_HAS_DERIVED | BOUNDARY_EFFECT)) === 0;
138137

139-
if (!inert && !is_root && push) {
138+
if (!inert && push) {
140139
if (parent_effect !== null) {
141140
push_effect(effect, parent_effect);
142141
}
@@ -391,7 +390,13 @@ export function destroy_effect_children(signal, remove_dom = false) {
391390

392391
while (effect !== null) {
393392
var next = effect.next;
394-
destroy_effect(effect, remove_dom);
393+
394+
if ((effect.f & ROOT_EFFECT) !== 0) {
395+
effect.parent = null;
396+
} else {
397+
destroy_effect(effect, remove_dom);
398+
}
399+
395400
effect = next;
396401
}
397402
}

packages/svelte/src/internal/client/runtime.js

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -661,13 +661,7 @@ function flush_queued_root_effects() {
661661
queued_root_effects = [];
662662

663663
for (var i = 0; i < length; i++) {
664-
var root = root_effects[i];
665-
666-
if ((root.f & CLEAN) === 0) {
667-
root.f ^= CLEAN;
668-
}
669-
670-
var collected_effects = process_effects(root);
664+
var collected_effects = process_effects(root_effects[i]);
671665
flush_queued_effects(collected_effects);
672666
}
673667
}
@@ -759,11 +753,12 @@ function process_effects(root) {
759753
/** @type {Effect[]} */
760754
var effects = [];
761755

762-
var effect = root.first;
756+
/** @type {Effect | null} */
757+
var effect = root;
763758

764759
while (effect !== null) {
765760
var flags = effect.f;
766-
var is_branch = (flags & BRANCH_EFFECT) !== 0;
761+
var is_branch = (flags & (BRANCH_EFFECT | ROOT_EFFECT)) !== 0;
767762
var is_skippable_branch = is_branch && (flags & CLEAN) !== 0;
768763

769764
if (!is_skippable_branch && (flags & INERT) === 0) {
@@ -788,6 +783,7 @@ function process_effects(root) {
788783
}
789784
}
790785

786+
/** @type {Effect | null} */
791787
var child = effect.first;
792788

793789
if (child !== null) {

0 commit comments

Comments
 (0)