From 1006943fa6d8e21b8eaee788c1fbc0a9a504a0c0 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 12 Feb 2025 11:43:58 +0000 Subject: [PATCH 1/6] tweak_self_invalidation --- .changeset/rare-hounds-wave.md | 5 +++++ packages/svelte/src/internal/client/reactivity/sources.js | 1 + packages/svelte/src/internal/client/runtime.js | 1 + 3 files changed, 7 insertions(+) create mode 100644 .changeset/rare-hounds-wave.md diff --git a/.changeset/rare-hounds-wave.md b/.changeset/rare-hounds-wave.md new file mode 100644 index 000000000000..f8cf772c8a27 --- /dev/null +++ b/.changeset/rare-hounds-wave.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +chore: tweak effect self invalidation logic diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index ded0ca05846b..430b8c2c2eec 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -190,6 +190,7 @@ export function internal_set(source, value) { if ( is_runes() && active_effect !== null && + !untracking && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ) { diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index d5d01c9b6db8..f064233c6357 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -457,6 +457,7 @@ export function update_reaction(reaction) { if ( is_runes() && untracked_writes !== null && + deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0 ) { for (i = 0; i < /** @type {Source[]} */ (untracked_writes).length; i++) { From 13f0253e93d3e8024994e4fbfa7c4037920e7eb6 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 12 Feb 2025 11:49:58 +0000 Subject: [PATCH 2/6] tweak_self_invalidation --- packages/svelte/src/internal/client/reactivity/sources.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index 430b8c2c2eec..ded0ca05846b 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -190,7 +190,6 @@ export function internal_set(source, value) { if ( is_runes() && active_effect !== null && - !untracking && (active_effect.f & CLEAN) !== 0 && (active_effect.f & (BRANCH_EFFECT | ROOT_EFFECT)) === 0 ) { From eac54bb7b02b5510c0aa9d8e273cfece9c8889bd Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 12 Feb 2025 11:51:27 +0000 Subject: [PATCH 3/6] tweak_self_invalidation --- packages/svelte/src/internal/client/runtime.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index f064233c6357..26a8927fd288 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -457,6 +457,7 @@ export function update_reaction(reaction) { if ( is_runes() && untracked_writes !== null && + !untracking && deps !== null && (reaction.f & (DERIVED | MAYBE_DIRTY | DIRTY)) === 0 ) { From 0d429c664a38c00e0b42a5179ccfa9b425c52faf Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 12 Feb 2025 11:53:16 +0000 Subject: [PATCH 4/6] tweak_self_invalidation --- packages/svelte/src/internal/client/runtime.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 26a8927fd288..c1b58e3b0cfc 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -371,17 +371,28 @@ export function handle_error(error, effect, previous_effect, component_context) * @param {Effect} effect * @param {number} [depth] */ -function schedule_possible_effect_self_invalidation(signal, effect, depth = 0) { +function schedule_possible_effect_self_invalidation( + signal, + effect, + depth = 0, + visited = new Set() +) { var reactions = signal.reactions; if (reactions === null) return; for (var i = 0; i < reactions.length; i++) { var reaction = reactions[i]; + if (visited.has(reaction)) { + continue; + } + visited.add(reaction); + if ((reaction.f & DERIVED) !== 0) { schedule_possible_effect_self_invalidation( /** @type {Derived} */ (reaction), effect, - depth + 1 + depth + 1, + visited ); } else if (effect === reaction) { if (depth === 0) { From da18260c785dc95192410f3d80a8066043a07ced Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 12 Feb 2025 16:16:22 +0000 Subject: [PATCH 5/6] fix --- .../client/dom/elements/transitions.js | 5 +++- .../svelte/src/internal/client/runtime.js | 23 ++++--------------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/packages/svelte/src/internal/client/dom/elements/transitions.js b/packages/svelte/src/internal/client/dom/elements/transitions.js index b3c16cdd080f..fbc1da95df95 100644 --- a/packages/svelte/src/internal/client/dom/elements/transitions.js +++ b/packages/svelte/src/internal/client/dom/elements/transitions.js @@ -14,6 +14,7 @@ import { current_each_item } from '../blocks/each.js'; import { TRANSITION_GLOBAL, TRANSITION_IN, TRANSITION_OUT } from '../../../../constants.js'; import { BLOCK_EFFECT, EFFECT_RAN, EFFECT_TRANSPARENT } from '../../constants.js'; import { queue_micro_task } from '../task.js'; +import { without_reactive_context } from './bindings/shared.js'; /** * @param {Element} element @@ -21,7 +22,9 @@ import { queue_micro_task } from '../task.js'; * @returns {void} */ function dispatch_event(element, type) { - element.dispatchEvent(new CustomEvent(type)); + without_reactive_context(() => { + element.dispatchEvent(new CustomEvent(type)); + }); } /** diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index c1b58e3b0cfc..6976547c5f79 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -369,33 +369,18 @@ export function handle_error(error, effect, previous_effect, component_context) /** * @param {Value} signal * @param {Effect} effect - * @param {number} [depth] + * @param {boolean} [root] */ -function schedule_possible_effect_self_invalidation( - signal, - effect, - depth = 0, - visited = new Set() -) { +function schedule_possible_effect_self_invalidation(signal, effect, root = true) { var reactions = signal.reactions; if (reactions === null) return; for (var i = 0; i < reactions.length; i++) { var reaction = reactions[i]; - if (visited.has(reaction)) { - continue; - } - visited.add(reaction); - if ((reaction.f & DERIVED) !== 0) { - schedule_possible_effect_self_invalidation( - /** @type {Derived} */ (reaction), - effect, - depth + 1, - visited - ); + schedule_possible_effect_self_invalidation(/** @type {Derived} */ (reaction), effect, false); } else if (effect === reaction) { - if (depth === 0) { + if (root) { set_signal_status(reaction, DIRTY); } else if ((reaction.f & CLEAN) !== 0) { set_signal_status(reaction, MAYBE_DIRTY); From ec3120ca8b24856021447bd6e30e693d03c6b942 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 12 Feb 2025 16:52:30 +0000 Subject: [PATCH 6/6] Update .changeset/rare-hounds-wave.md Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/rare-hounds-wave.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/rare-hounds-wave.md b/.changeset/rare-hounds-wave.md index f8cf772c8a27..11b368b038ae 100644 --- a/.changeset/rare-hounds-wave.md +++ b/.changeset/rare-hounds-wave.md @@ -2,4 +2,4 @@ 'svelte': patch --- -chore: tweak effect self invalidation logic +chore: tweak effect self invalidation logic, run transition dispatches without reactive context