From afc21ac27d4229261205808fe04e2ad98677b44b Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Tue, 2 Apr 2024 14:38:24 +0100 Subject: [PATCH 1/2] fix: improve unowned derived signal heuristics --- .changeset/big-moons-occur.md | 5 +++ .../svelte/src/internal/client/runtime.js | 7 ++-- .../samples/derived-unowned-4/_config.js | 17 ++++++++++ .../samples/derived-unowned-4/main.svelte | 33 +++++++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 .changeset/big-moons-occur.md create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-unowned-4/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/derived-unowned-4/main.svelte diff --git a/.changeset/big-moons-occur.md b/.changeset/big-moons-occur.md new file mode 100644 index 000000000000..42429d31f62a --- /dev/null +++ b/.changeset/big-moons-occur.md @@ -0,0 +1,5 @@ +--- +"svelte": patch +--- + +fix: improve unowned derived signal heuristics diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index d3d7e88412aa..5febd82f7abd 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -171,6 +171,7 @@ export function check_dirtiness(reaction) { if ((flags & MAYBE_DIRTY) !== 0) { var dependencies = reaction.deps; + var is_unowned = (flags & UNOWNED) !== 0; if (dependencies !== null) { var length = dependencies.length; @@ -191,7 +192,6 @@ export function check_dirtiness(reaction) { // if our dependency write version is higher. If it is then we can assume // that state has changed to a newer version and thus this unowned signal // is also dirty. - var is_unowned = (flags & UNOWNED) !== 0; var version = dependency.version; if (is_unowned && version > /** @type {import('#client').Derived} */ (reaction).version) { @@ -201,7 +201,10 @@ export function check_dirtiness(reaction) { } } - set_signal_status(reaction, CLEAN); + // Unowned signals are always maybe dirty, as we instead check their depedency versions. + if (!is_unowned) { + set_signal_status(reaction, CLEAN); + } } return false; diff --git a/packages/svelte/tests/runtime-runes/samples/derived-unowned-4/_config.js b/packages/svelte/tests/runtime-runes/samples/derived-unowned-4/_config.js new file mode 100644 index 000000000000..4868a770763e --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-unowned-4/_config.js @@ -0,0 +1,17 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + async test({ assert, target }) { + let [btn1] = target.querySelectorAll('button'); + + flushSync(() => { + btn1.click(); + }); + + assert.htmlEqual( + target.innerHTML, + `
2
2
2
2
` + ); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/derived-unowned-4/main.svelte b/packages/svelte/tests/runtime-runes/samples/derived-unowned-4/main.svelte new file mode 100644 index 000000000000..7bc28312a551 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/derived-unowned-4/main.svelte @@ -0,0 +1,33 @@ + + + + +
+ {thing?.data?.name} +
+
+ {thing?.name} +
+
+ {thing?.data?.position} +
+
+ {thing?.position} +
From ab626af52cb6a3a0a701db4b52de6b91a62f4f1c Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Tue, 2 Apr 2024 14:40:34 +0100 Subject: [PATCH 2/2] spelling --- 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 5febd82f7abd..28428c1fb78a 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -201,7 +201,7 @@ export function check_dirtiness(reaction) { } } - // Unowned signals are always maybe dirty, as we instead check their depedency versions. + // Unowned signals are always maybe dirty, as we instead check their dependency versions. if (!is_unowned) { set_signal_status(reaction, CLEAN); }