@@ -101,6 +101,17 @@ export function set_reaction_sources(sources) {
101101 reaction_sources = sources ;
102102}
103103
104+ /** @param {Value } value */
105+ export function push_reaction_value ( value ) {
106+ if ( active_reaction !== null && active_reaction . f & EFFECT_IS_UPDATING ) {
107+ if ( reaction_sources === null ) {
108+ set_reaction_sources ( [ value ] ) ;
109+ } else {
110+ reaction_sources . push ( value ) ;
111+ }
112+ }
113+ }
114+
104115/**
105116 * The dependencies of the reaction that is currently being executed. In many cases,
106117 * the dependencies are unchanged between runs, and so this will be `null` unless
@@ -875,21 +886,23 @@ export function get(signal) {
875886
876887 // Register the dependency on the current reaction signal.
877888 if ( active_reaction !== null && ! untracking ) {
878- var deps = active_reaction . deps ;
879- if ( signal . rv < read_version ) {
880- signal . rv = read_version ;
881- // If the signal is accessing the same dependencies in the same
882- // order as it did last time, increment `skipped_deps`
883- // rather than updating `new_deps`, which creates GC cost
884- if ( new_deps === null && deps !== null && deps [ skipped_deps ] === signal ) {
885- skipped_deps ++ ;
886- } else if ( new_deps === null ) {
887- new_deps = [ signal ] ;
888- } else if ( ! skip_reaction || ! new_deps . includes ( signal ) ) {
889- // Normally we can push duplicated dependencies to `new_deps`, but if we're inside
890- // an unowned derived because skip_reaction is true, then we need to ensure that
891- // we don't have duplicates
892- new_deps . push ( signal ) ;
889+ if ( ! reaction_sources ?. includes ( signal ) ) {
890+ var deps = active_reaction . deps ;
891+ if ( signal . rv < read_version ) {
892+ signal . rv = read_version ;
893+ // If the signal is accessing the same dependencies in the same
894+ // order as it did last time, increment `skipped_deps`
895+ // rather than updating `new_deps`, which creates GC cost
896+ if ( new_deps === null && deps !== null && deps [ skipped_deps ] === signal ) {
897+ skipped_deps ++ ;
898+ } else if ( new_deps === null ) {
899+ new_deps = [ signal ] ;
900+ } else if ( ! skip_reaction || ! new_deps . includes ( signal ) ) {
901+ // Normally we can push duplicated dependencies to `new_deps`, but if we're inside
902+ // an unowned derived because skip_reaction is true, then we need to ensure that
903+ // we don't have duplicates
904+ new_deps . push ( signal ) ;
905+ }
893906 }
894907 }
895908 } else if (
0 commit comments