From e3d69b537204720601e2a4d23147f64f399e09e4 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Mon, 10 Feb 2025 12:14:17 +0000 Subject: [PATCH] fix: when an unowned derived is tracked again, remove unowned flag --- .changeset/nasty-pigs-lay.md | 5 +++++ .../svelte/src/internal/client/runtime.js | 20 ++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 .changeset/nasty-pigs-lay.md diff --git a/.changeset/nasty-pigs-lay.md b/.changeset/nasty-pigs-lay.md new file mode 100644 index 0000000000..b7252b70f7 --- /dev/null +++ b/.changeset/nasty-pigs-lay.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: when an unowned derived is tracked again, remove unowned flag diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 30f14b7356..65376ddf39 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -184,19 +184,29 @@ export function check_dirtiness(reaction) { // If we are working with a disconnected or an unowned signal that is now connected (due to an active effect) // then we need to re-connect the reaction to the dependency if (is_disconnected || is_unowned_connected) { + var derived = /** @type {Derived} */ (reaction); + for (i = 0; i < length; i++) { dependency = dependencies[i]; // We always re-add all reactions (even duplicates) if the derived was // previously disconnected, however we don't if it was unowned as we // de-duplicate dependencies in that case - if (is_disconnected || !dependency?.reactions?.includes(reaction)) { - (dependency.reactions ??= []).push(reaction); + if (is_disconnected || !dependency?.reactions?.includes(derived)) { + (dependency.reactions ??= []).push(derived); } } if (is_disconnected) { - reaction.f ^= DISCONNECTED; + derived.f ^= DISCONNECTED; + } + var parent = derived.parent; + + if (is_unowned_connected && parent !== null && (parent.f & UNOWNED) === 0) { + // If the derived is owned by another derived then mark it as owned agaub + // as the derived value might have been referenced in a different context + // and now has a reacive context managing it + derived.f ^= UNOWNED; } } @@ -409,6 +419,10 @@ export function update_reaction(reaction) { (flags & UNOWNED) !== 0 && (!is_flushing_effect || previous_reaction === null || previous_untracking); + if (skip_reaction) { + // debugger + } + derived_sources = null; set_component_context(reaction.ctx); untracking = false;