Skip to content

Commit bb9c448

Browse files
committed
fix: further avoid duplicate signal dependencies
visitor another approach tune tune
1 parent 84325bf commit bb9c448

File tree

2 files changed

+12
-5
lines changed

2 files changed

+12
-5
lines changed

.changeset/witty-phones-retire.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'svelte': patch
3+
---
4+
5+
fix: handle duplicate signal dependencies gracefully

packages/svelte/src/internal/client/runtime.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -419,10 +419,15 @@ function remove_reaction(signal, dependency) {
419419
export function remove_reactions(signal, start_index) {
420420
const dependencies = signal.deps;
421421
if (dependencies !== null) {
422-
const active_dependencies = start_index === 0 ? null : dependencies.slice(0, start_index);
422+
var active_dependencies = start_index === 0 ? null : dependencies.slice(0, start_index);
423+
var visited = new Set();
423424
let i;
424425
for (i = start_index; i < dependencies.length; i++) {
425426
const dependency = dependencies[i];
427+
if (visited.has(dependency)) {
428+
continue;
429+
}
430+
visited.add(dependency);
426431
// Avoid removing a reaction if we know that it is active (start_index will not be 0)
427432
if (active_dependencies === null || !active_dependencies.includes(dependency)) {
428433
remove_reaction(signal, dependency);
@@ -774,10 +779,7 @@ export function get(signal) {
774779
) {
775780
if (current_dependencies === null) {
776781
current_dependencies = [signal];
777-
} else if (
778-
current_dependencies[current_dependencies.length - 1] !== signal &&
779-
!current_dependencies.includes(signal)
780-
) {
782+
} else if (current_dependencies[current_dependencies.length - 1] !== signal) {
781783
current_dependencies.push(signal);
782784
}
783785
}

0 commit comments

Comments
 (0)