@@ -40,7 +40,7 @@ import {
4040 update_derived
4141} from './reactivity/deriveds.js' ;
4242import * as e from './errors.js' ;
43- import { FILENAME } from '../../constants.js' ;
43+ import { FILENAME , UNINITIALIZED } from '../../constants.js' ;
4444import { tracing_mode_flag } from '../flags/index.js' ;
4545import { tracing_expressions , get_stack } from './dev/tracing.js' ;
4646import {
@@ -783,24 +783,44 @@ function flush_deferred() {
783783 }
784784}
785785
786+ /**
787+ * @param {Source | Derived } signal
788+ * @param {any } forks
789+ */
790+ function fork_dependencies ( signal , forks ) {
791+ var entry = forks . get ( signal ) ;
792+ if ( entry === undefined ) {
793+ entry = { v : signal . v } ;
794+ forks . set ( signal , entry ) ;
795+ if ( ( signal . f & DERIVED ) !== 0 ) {
796+ var deps = /** @type {Derived } */ ( signal ) . deps ;
797+ if ( deps !== null ) {
798+ for ( var i = 0 ; i < deps . length ; i ++ ) {
799+ fork_dependencies ( deps [ i ] , forks ) ;
800+ }
801+ }
802+ }
803+ }
804+ }
805+
786806/**
787807 * @param {Effect } signal
788- * @param {Source } [source]
789808 * @returns {void }
790809 */
791- export function schedule_effect ( signal , source ) {
792- if ( source && ( signal . f & ASYNC_DERIVED ) !== 0 ) {
810+ export function schedule_effect ( signal ) {
811+ if ( ( signal . f & ASYNC_DERIVED ) !== 0 ) {
793812 if ( active_effect === signal ) {
794813 set_signal_status ( signal , MAYBE_DIRTY ) ;
795814 return ;
796815 }
797816 var boundary = get_boundary ( signal ) ;
798817 // @ts -ignore
799- var sources = boundary . fn . sources ;
800- var entry = sources . get ( source ) ;
801- if ( entry === undefined ) {
802- entry = { v : source . v } ;
803- sources . set ( source , entry ) ;
818+ var forks = boundary . fn . forks ;
819+ var deps = signal . deps ;
820+ if ( deps !== null ) {
821+ for ( var i = 0 ; i < deps . length ; i ++ ) {
822+ fork_dependencies ( deps [ i ] , forks ) ;
823+ }
804824 }
805825 }
806826
@@ -1043,28 +1063,32 @@ export function get(signal) {
10431063 }
10441064 }
10451065
1046- var value = signal . v ;
1066+ var value = /** @type { V } */ ( UNINITIALIZED ) ;
10471067
1048- if ( is_derived ) {
1049- derived = /** @type {Derived } */ ( signal ) ;
1068+ var target_effect = event_boundary_effect ?? active_effect ;
10501069
1051- if ( check_dirtiness ( derived ) ) {
1052- update_derived ( derived ) ;
1070+ if ( target_effect !== null && ! is_flushing_async_derived ) {
1071+ var boundary = get_boundary ( target_effect ) ;
1072+ if ( boundary !== null ) {
1073+ // @ts -ignore
1074+ var forks = boundary . fn . forks ;
1075+ var entry = forks . get ( signal ) ;
1076+ if ( entry !== undefined ) {
1077+ value = entry . v ;
1078+ }
10531079 }
1054- value = signal . v ;
1055- } else {
1056- var target_effect = event_boundary_effect ?? active_effect ;
1057-
1058- if ( target_effect !== null && ! is_flushing_async_derived ) {
1059- var boundary = get_boundary ( target_effect ) ;
1060- if ( boundary !== null ) {
1061- // @ts -ignore
1062- var sources = boundary . fn . sources ;
1063- var entry = sources . get ( signal ) ;
1064- if ( entry !== undefined ) {
1065- value = entry . v ;
1066- }
1080+ }
1081+
1082+ if ( value === UNINITIALIZED ) {
1083+ if ( is_derived ) {
1084+ derived = /** @type {Derived } */ ( signal ) ;
1085+
1086+ if ( check_dirtiness ( derived ) ) {
1087+ update_derived ( derived ) ;
10671088 }
1089+ value = signal . v ;
1090+ } else {
1091+ value = signal . v ;
10681092 }
10691093 }
10701094
0 commit comments