From 7190f991e73a7f061c78ac15efb26ea62284059d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 22 Feb 2024 14:17:46 -0500 Subject: [PATCH] fix some stuff --- packages/svelte/src/internal/client/constants.js | 1 + packages/svelte/src/internal/client/dom/blocks/each.js | 4 ++-- packages/svelte/src/internal/client/dom/blocks/if.js | 3 ++- .../src/internal/client/reactivity/computations.js | 3 +++ packages/svelte/src/internal/client/runtime.js | 10 ++++++++-- 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/internal/client/constants.js b/packages/svelte/src/internal/client/constants.js index d53d438ce6..4344a4d51e 100644 --- a/packages/svelte/src/internal/client/constants.js +++ b/packages/svelte/src/internal/client/constants.js @@ -11,6 +11,7 @@ export const MAYBE_DIRTY = 1 << 10; export const INERT = 1 << 11; export const DESTROYED = 1 << 12; export const ROOT_EFFECT = 1 << 13; +export const BRANCH_EFFECT = 1 << 14; export const ROOT_BLOCK = 0; export const IF_BLOCK = 1; diff --git a/packages/svelte/src/internal/client/dom/blocks/each.js b/packages/svelte/src/internal/client/dom/blocks/each.js index d822b53fac..2f52f0b889 100644 --- a/packages/svelte/src/internal/client/dom/blocks/each.js +++ b/packages/svelte/src/internal/client/dom/blocks/each.js @@ -33,7 +33,7 @@ import { import { source, mutable_source } from '../../reactivity/sources.js'; import { trigger_transitions } from '../../transitions.js'; import { is_array } from '../../utils.js'; -import { EACH_BLOCK, EACH_ITEM_BLOCK } from '../../constants.js'; +import { BRANCH_EFFECT, EACH_BLOCK, EACH_ITEM_BLOCK } from '../../constants.js'; import { unstate } from '../../proxy.js'; const NEW_BLOCK = -1; @@ -462,7 +462,7 @@ export function each_indexed(anchor_node, collection, flags, render_fn, fallback } length = nl; - }); + }).f |= BRANCH_EFFECT; // TODO create a primitive for this } /** diff --git a/packages/svelte/src/internal/client/dom/blocks/if.js b/packages/svelte/src/internal/client/dom/blocks/if.js index 91251f4d78..771b225da0 100644 --- a/packages/svelte/src/internal/client/dom/blocks/if.js +++ b/packages/svelte/src/internal/client/dom/blocks/if.js @@ -7,6 +7,7 @@ import { import { remove } from '../../reconciler.js'; import { pause_effect, render_effect, resume_effect } from '../../reactivity/computations.js'; import { current_effect } from '../../runtime.js'; +import { BRANCH_EFFECT, RENDER_EFFECT } from '../../constants.js'; /** * @param {Comment} anchor_node @@ -76,5 +77,5 @@ export function if_block(anchor_node, condition_fn, consequent_fn, alternate_fn) }); } } - }); + }).f |= BRANCH_EFFECT; // TODO create a primitive for this } diff --git a/packages/svelte/src/internal/client/reactivity/computations.js b/packages/svelte/src/internal/client/reactivity/computations.js index 47a2d11024..66cdb66ad4 100644 --- a/packages/svelte/src/internal/client/reactivity/computations.js +++ b/packages/svelte/src/internal/client/reactivity/computations.js @@ -314,9 +314,12 @@ function pause_children(effect, transitions) { export function destroy_effect(effect) { // TODO call cleanup functions (but not sure when exactly?) + // TODO detach from parent effect + // TODO distinguish between 'block effects' (?) which own their own DOM // and other render effects if (effect.dom) { + // TODO skip already-detached DOM remove(effect.dom); } diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index caac577b91..9981cee10b 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -27,7 +27,8 @@ import { INERT, MANAGED, SOURCE, - STATE_SYMBOL + STATE_SYMBOL, + BRANCH_EFFECT } from './constants.js'; import { flush_tasks } from './dom/task.js'; @@ -404,7 +405,12 @@ export function execute_effect(signal) { current_effect = signal; try { - destroy_references(signal); + if ((signal.f & BRANCH_EFFECT) === 0) { + // branch effects (i.e. {#if ...} blocks) need to keep their references + // TODO their children should detach themselves from signal.r when destroyed + destroy_references(signal); + } + if (teardown !== null) { teardown(); }