From 55e722d6904c2385cd6a7dfd4bae41a13c2451fd Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 24 Mar 2026 04:46:00 -0400 Subject: [PATCH] WIP --- .../src/internal/client/reactivity/deriveds.js | 7 ++++--- .../svelte/src/internal/client/reactivity/effects.js | 2 +- .../svelte/src/internal/client/reactivity/sources.js | 3 ++- .../svelte/src/internal/client/reactivity/types.d.ts | 6 ++++-- packages/svelte/src/internal/client/runtime.js | 12 ++++++------ 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index 6ad7139be2..d1a5e2fbfa 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -88,9 +88,10 @@ export function derived(fn) { f: flags, fn, reactions: null, - rv: -1, - v: /** @type {V} */ (UNINITIALIZED), + cv: -1, + rv: 0, wv: 0, + v: /** @type {V} */ (UNINITIALIZED), parent: parent_derived ?? active_effect, ac: null }; @@ -385,7 +386,7 @@ export function execute_derived(derived) { * @returns {void} */ export function update_derived(derived) { - derived.rv = write_version; + derived.cv = write_version; var old_value = derived.v; var value = execute_derived(derived); diff --git a/packages/svelte/src/internal/client/reactivity/effects.js b/packages/svelte/src/internal/client/reactivity/effects.js index bf8ae97ca1..0f90d3a012 100644 --- a/packages/svelte/src/internal/client/reactivity/effects.js +++ b/packages/svelte/src/internal/client/reactivity/effects.js @@ -113,7 +113,7 @@ function create_effect(type, fn) { prev: null, teardown: null, wv: 0, - rv: -1, + cv: -1, ac: null }; diff --git a/packages/svelte/src/internal/client/reactivity/sources.js b/packages/svelte/src/internal/client/reactivity/sources.js index 8f73c99268..5e7e4594b0 100644 --- a/packages/svelte/src/internal/client/reactivity/sources.js +++ b/packages/svelte/src/internal/client/reactivity/sources.js @@ -79,6 +79,7 @@ export function source(v, stack) { v, reactions: null, equals, + cv: 0, rv: 0, wv: 0 }; @@ -238,7 +239,7 @@ export function internal_set(source, value, updated_during_traversal = null) { } } - source.wv = source.rv = increment_write_version(); + source.wv = source.cv = increment_write_version(); // For debugging, in case you want to know which reactions are being scheduled: // log_reactions(source); diff --git a/packages/svelte/src/internal/client/reactivity/types.d.ts b/packages/svelte/src/internal/client/reactivity/types.d.ts index 546a403434..ab458cbadd 100644 --- a/packages/svelte/src/internal/client/reactivity/types.d.ts +++ b/packages/svelte/src/internal/client/reactivity/types.d.ts @@ -11,8 +11,8 @@ import type { Boundary } from '../dom/blocks/boundary'; export interface Signal { /** Flags bitmask */ f: number; - /** Read version */ - rv: number; + /** Check version */ + cv: number; /** Write version */ wv: number; } @@ -38,6 +38,8 @@ export interface Value extends Signal { set_during_effect?: boolean; /** A function that retrieves the underlying source, used for each block item signals */ trace?: null | (() => void); + /** Read version */ + rv: number; } export interface Reaction extends Signal { diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 56eec8b4f3..805206b0c9 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -178,7 +178,7 @@ export function is_dirty(reaction) { } } - if (dependency.wv > reaction.rv) { + if (dependency.wv > reaction.cv) { return true; } } @@ -193,7 +193,7 @@ export function is_dirty(reaction) { } } - reaction.rv = write_version; + reaction.cv = write_version; return false; } @@ -324,13 +324,13 @@ export function update_reaction(reaction) { // so that they are not added again if (previous_reaction.deps !== null) { for (let i = 0; i < previous_skipped_deps; i += 1) { - // previous_reaction.deps[i].rv = read_version; + previous_reaction.deps[i].rv = read_version; } } if (previous_deps !== null) { for (const dep of previous_deps) { - // dep.rv = read_version; + dep.rv = read_version; } } @@ -462,7 +462,7 @@ export function update_effect(effect) { destroy_effect_children(effect); } - effect.rv = write_version; + effect.cv = write_version; execute_effect_teardown(effect); var teardown = update_reaction(effect); @@ -547,7 +547,7 @@ export function get(signal) { if ((active_reaction.f & REACTION_IS_UPDATING) !== 0) { // we're in the effect init/update cycle if (signal.rv < read_version) { - // signal.rv = read_version; + signal.rv = read_version; // If the signal is accessing the same dependencies in the same // order as it did last time, increment `skipped_deps`