From 387aa469b37273562d2a64c149ba30d0709c05c5 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 9 Jan 2025 14:54:51 +0000 Subject: [PATCH 1/7] fix: reset dependency read versions after reaction execution --- packages/svelte/src/internal/client/runtime.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 202608ce06bd..387f50ea1d7a 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -424,10 +424,13 @@ export function update_reaction(reaction) { reaction.deps = deps = new_deps; } - if (!skip_reaction) { - for (i = skipped_deps; i < deps.length; i++) { - (deps[i].reactions ??= []).push(reaction); + for (i = skipped_deps; i < deps.length; i++) { + var dep = deps[i]; + if (!skip_reaction) { + (dep.reactions ??= []).push(reaction); } + // Reset read version back to 0 + dep.rv = 0; } } else if (deps !== null && skipped_deps < deps.length) { remove_reactions(reaction, skipped_deps); From b6669fa6e0db8bcf880a569787639fb594d7cdd5 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 9 Jan 2025 15:17:14 +0000 Subject: [PATCH 2/7] fix: reset dependency read versions after reaction execution --- packages/svelte/src/internal/client/runtime.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 387f50ea1d7a..673444047653 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -429,7 +429,11 @@ export function update_reaction(reaction) { if (!skip_reaction) { (dep.reactions ??= []).push(reaction); } - // Reset read version back to 0 + // Reset read version back to 0, otherwise if we are + // returning to an existing reaction from before then + // and it uses this depedency too then it will be the + // same read version as the current global read version + // and not correctly be added as a dependency dep.rv = 0; } } else if (deps !== null && skipped_deps < deps.length) { From 0168c341e1a0cb91deebd5f331b93327ea03eee7 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 9 Jan 2025 15:19:00 +0000 Subject: [PATCH 3/7] fix: reset dependency read versions after reaction execution --- packages/svelte/src/internal/client/runtime.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 673444047653..88be235e1483 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -429,11 +429,12 @@ export function update_reaction(reaction) { if (!skip_reaction) { (dep.reactions ??= []).push(reaction); } - // Reset read version back to 0, otherwise if we are - // returning to an existing reaction from before then - // and it uses this depedency too then it will be the - // same read version as the current global read version - // and not correctly be added as a dependency + // Reset read version back to 0. If we are + // returning to an previous reaction and + // it were to read this depedency too and we + // didn't reset the read version, then it would + // not be added as a dependency to that reaction + // as the global read version won't have changed dep.rv = 0; } } else if (deps !== null && skipped_deps < deps.length) { From d172aac06cc2c6d032b4a774f396a8e32c0da9df Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 9 Jan 2025 15:58:56 +0000 Subject: [PATCH 4/7] fix: reset dependency read versions after reaction execution --- .../svelte/src/internal/client/runtime.js | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 88be235e1483..6f6b91f97fcf 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -424,24 +424,24 @@ export function update_reaction(reaction) { reaction.deps = deps = new_deps; } - for (i = skipped_deps; i < deps.length; i++) { - var dep = deps[i]; - if (!skip_reaction) { - (dep.reactions ??= []).push(reaction); + if (!skip_reaction) { + for (i = skipped_deps; i < deps.length; i++) { + (deps[i].reactions ??= []).push(reaction); } - // Reset read version back to 0. If we are - // returning to an previous reaction and - // it were to read this depedency too and we - // didn't reset the read version, then it would - // not be added as a dependency to that reaction - // as the global read version won't have changed - dep.rv = 0; } } else if (deps !== null && skipped_deps < deps.length) { remove_reactions(reaction, skipped_deps); deps.length = skipped_deps; } + // If we are returning to an previous reaction then + // we need to increment the read version to ensure that + // any dependencies in this reaction aren't marked with + // the same version + if (previous_reaction !== null) { + read_version++; + } + return result; } finally { new_deps = previous_deps; From 3e70c4396ba9e990a2cfcdab886597b97fb09b94 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Thu, 9 Jan 2025 16:10:13 +0000 Subject: [PATCH 5/7] fix: reset dependency read versions after reaction execution --- packages/svelte/src/internal/client/runtime.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 6f6b91f97fcf..3c8879eb317b 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -434,7 +434,7 @@ export function update_reaction(reaction) { deps.length = skipped_deps; } - // If we are returning to an previous reaction then + // If we are returning to an previous reaction then // we need to increment the read version to ensure that // any dependencies in this reaction aren't marked with // the same version From b2bf4295cb0357efd4a278956b732d1f89a64814 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Thu, 9 Jan 2025 17:17:07 +0100 Subject: [PATCH 6/7] chore: add test --- .../Component.svelte | 7 +++++++ .../read-version-previous-reaction/_config.js | 19 +++++++++++++++++++ .../main.svelte | 18 ++++++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/Component.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/main.svelte diff --git a/packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/Component.svelte b/packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/Component.svelte new file mode 100644 index 000000000000..afb62ced2f4b --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/Component.svelte @@ -0,0 +1,7 @@ + + +

{label}

diff --git a/packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/_config.js b/packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/_config.js new file mode 100644 index 000000000000..650e48e84ccd --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/_config.js @@ -0,0 +1,19 @@ +import { ok, test } from '../../test'; +import { flushSync } from 'svelte'; + +export default test({ + html: `

0

`, + + async test({ assert, target }) { + const p = target.querySelector('p'); + const btn = target.querySelector('button'); + flushSync(() => { + btn?.click(); + }); + assert.equal(p?.innerHTML, '1'); + flushSync(() => { + btn?.click(); + }); + assert.equal(p?.innerHTML, '2'); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/main.svelte b/packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/main.svelte new file mode 100644 index 000000000000..773aabeea30b --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/read-version-previous-reaction/main.svelte @@ -0,0 +1,18 @@ + + + + + \ No newline at end of file From b428f01bbda4ac9e12327688dfe7f322026cdd63 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 9 Jan 2025 11:22:23 -0500 Subject: [PATCH 7/7] changeset --- .changeset/fifty-chefs-invent.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/fifty-chefs-invent.md diff --git a/.changeset/fifty-chefs-invent.md b/.changeset/fifty-chefs-invent.md new file mode 100644 index 000000000000..eb151f67e2d7 --- /dev/null +++ b/.changeset/fifty-chefs-invent.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: reset dependency read versions after reaction execution