Skip to content

Commit a577ce0

Browse files
authored
chore: ensure effect destruction of deriveds is consistent (#13693)
* chore: ensure effect destruction of deriveds is consistent * chore: ensure effect destruction of deriveds is consistent
1 parent bb491f1 commit a577ce0

File tree

2 files changed

+54
-44
lines changed

2 files changed

+54
-44
lines changed

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

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
component_context,
55
active_effect,
66
active_reaction,
7-
destroy_effect_children,
87
dev_current_component_function,
98
update_effect,
109
get,
@@ -43,6 +42,7 @@ import * as e from '../errors.js';
4342
import { DEV } from 'esm-env';
4443
import { define_property } from '../../shared/utils.js';
4544
import { get_next_sibling } from '../dom/operations.js';
45+
import { destroy_derived } from './deriveds.js';
4646

4747
/**
4848
* @param {'$effect' | '$effect.pre' | '$inspect'} rune
@@ -364,6 +364,54 @@ export function execute_effect_teardown(effect) {
364364
}
365365
}
366366

367+
/**
368+
* @param {Effect} signal
369+
* @returns {void}
370+
*/
371+
export function destroy_effect_deriveds(signal) {
372+
var deriveds = signal.deriveds;
373+
374+
if (deriveds !== null) {
375+
signal.deriveds = null;
376+
377+
for (var i = 0; i < deriveds.length; i += 1) {
378+
destroy_derived(deriveds[i]);
379+
}
380+
}
381+
}
382+
383+
/**
384+
* @param {Effect} signal
385+
* @param {boolean} remove_dom
386+
* @returns {void}
387+
*/
388+
export function destroy_effect_children(signal, remove_dom = false) {
389+
var effect = signal.first;
390+
signal.first = signal.last = null;
391+
392+
while (effect !== null) {
393+
var next = effect.next;
394+
destroy_effect(effect, remove_dom);
395+
effect = next;
396+
}
397+
}
398+
399+
/**
400+
* @param {Effect} signal
401+
* @returns {void}
402+
*/
403+
export function destroy_block_effect_children(signal) {
404+
var effect = signal.first;
405+
406+
while (effect !== null) {
407+
var next = effect.next;
408+
if ((effect.f & BRANCH_EFFECT) === 0) {
409+
destroy_effect(effect);
410+
}
411+
effect = next;
412+
}
413+
}
414+
367415
/**
368416
* @param {Effect} effect
369417
* @param {boolean} [remove_dom]
@@ -401,6 +449,7 @@ export function destroy_effect(effect, remove_dom = true) {
401449
removed = true;
402450
}
403451

452+
destroy_effect_deriveds(effect);
404453
destroy_effect_children(effect, remove_dom && !removed);
405454
remove_reactions(effect, 0);
406455
set_signal_status(effect, DESTROYED);

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

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
import { DEV } from 'esm-env';
33
import { define_property, get_descriptors, get_prototype_of } from '../shared/utils.js';
44
import {
5-
destroy_effect,
5+
destroy_block_effect_children,
6+
destroy_effect_children,
7+
destroy_effect_deriveds,
68
effect,
79
execute_effect_teardown,
810
unlink_effect
@@ -403,48 +405,6 @@ export function remove_reactions(signal, start_index) {
403405
}
404406
}
405407

406-
/**
407-
* @param {Effect} signal
408-
* @param {boolean} remove_dom
409-
* @returns {void}
410-
*/
411-
export function destroy_effect_children(signal, remove_dom = false) {
412-
var deriveds = signal.deriveds;
413-
414-
if (deriveds !== null) {
415-
signal.deriveds = null;
416-
417-
for (var i = 0; i < deriveds.length; i += 1) {
418-
destroy_derived(deriveds[i]);
419-
}
420-
}
421-
422-
var effect = signal.first;
423-
signal.first = signal.last = null;
424-
425-
while (effect !== null) {
426-
var next = effect.next;
427-
destroy_effect(effect, remove_dom);
428-
effect = next;
429-
}
430-
}
431-
432-
/**
433-
* @param {Effect} signal
434-
* @returns {void}
435-
*/
436-
export function destroy_block_effect_children(signal) {
437-
var effect = signal.first;
438-
439-
while (effect !== null) {
440-
var next = effect.next;
441-
if ((effect.f & BRANCH_EFFECT) === 0) {
442-
destroy_effect(effect);
443-
}
444-
effect = next;
445-
}
446-
}
447-
448408
/**
449409
* @param {Effect} effect
450410
* @returns {void}
@@ -470,6 +430,7 @@ export function update_effect(effect) {
470430
}
471431

472432
try {
433+
destroy_effect_deriveds(effect);
473434
if ((flags & BLOCK_EFFECT) !== 0) {
474435
destroy_block_effect_children(effect);
475436
} else {

0 commit comments

Comments
 (0)