Skip to content

Commit 37fa415

Browse files
committed
chore: ensure effect destruction of deriveds is consistent
1 parent 793a8de commit 37fa415

File tree

2 files changed

+54
-43
lines changed

2 files changed

+54
-43
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,
@@ -42,6 +41,7 @@ import * as e from '../errors.js';
4241
import { DEV } from 'esm-env';
4342
import { define_property } from '../../shared/utils.js';
4443
import { get_next_sibling } from '../dom/operations.js';
44+
import { destroy_derived } from './deriveds.js';
4545

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

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

438+
destroy_effect_deriveds(effect);
390439
destroy_effect_children(effect, remove_dom && !removed);
391440
remove_reactions(effect, 0);
392441
set_signal_status(effect, DESTROYED);

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

Lines changed: 4 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@
22
import { DEV } from 'esm-env';
33
import { define_property, get_descriptors, get_prototype_of } from '../shared/utils.js';
44
import {
5+
destroy_block_effect_children,
56
destroy_effect,
7+
destroy_effect_children,
8+
destroy_effect_deriveds,
69
effect,
710
execute_effect_teardown,
811
unlink_effect
@@ -403,48 +406,6 @@ export function remove_reactions(signal, start_index) {
403406
}
404407
}
405408

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-
448409
/**
449410
* @param {Effect} effect
450411
* @returns {void}
@@ -470,6 +431,7 @@ export function update_effect(effect) {
470431
}
471432

472433
try {
434+
destroy_effect_deriveds(effect);
473435
if ((flags & BLOCK_EFFECT) !== 0) {
474436
destroy_block_effect_children(effect);
475437
} else {

0 commit comments

Comments
 (0)