@@ -180,29 +180,11 @@ export type Hook = {
180180 next : Hook | null ,
181181} ;
182182
183- // The effect "instance" is a shared object that remains the same for the entire
184- // lifetime of an effect. In Rust terms, a RefCell. We use it to store the
185- // "destroy" function that is returned from an effect, because that is stateful.
186- // The field is `undefined` if the effect is unmounted, or if the effect ran
187- // but is not stateful. We don't explicitly track whether the effect is mounted
188- // or unmounted because that can be inferred by the hiddenness of the fiber in
189- // the tree, i.e. whether there is a hidden Offscreen fiber above it.
190- //
191- // It's unfortunate that this is stored on a separate object, because it adds
192- // more memory per effect instance, but it's conceptually sound. I think there's
193- // likely a better data structure we could use for effects; perhaps just one
194- // array of effect instances per fiber. But I think this is OK for now despite
195- // the additional memory and we can follow up with performance
196- // optimizations later.
197- type EffectInstance = {
198- destroy : void | ( ( ) => void ) ,
199- } ;
200-
201183export type Effect = {
202184 tag : HookFlags ,
203185 create : ( ) => ( ( ) => void ) | void ,
204- inst : EffectInstance ,
205- deps : Array < mixed > | null ,
186+ destroy : ( ( ) => void ) | void ,
187+ deps : Array < mixed > | void | null ,
206188 next : Effect ,
207189} ;
208190
@@ -1680,7 +1662,7 @@ function mountSyncExternalStore<T>(
16801662 pushEffect(
16811663 HookHasEffect | HookPassive,
16821664 updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot),
1683- createEffectInstance() ,
1665+ undefined ,
16841666 null,
16851667 );
16861668
@@ -1737,7 +1719,7 @@ function updateSyncExternalStore<T>(
17371719 pushEffect (
17381720 HookHasEffect | HookPassive ,
17391721 updateStoreInstance . bind ( null , fiber , inst , nextSnapshot , getSnapshot ) ,
1740- createEffectInstance ( ) ,
1722+ undefined ,
17411723 null ,
17421724 ) ;
17431725
@@ -1878,13 +1860,13 @@ function rerenderState<S>(
18781860function pushEffect(
18791861 tag: HookFlags,
18801862 create: () => ( ( ) => void ) | void ,
1881- inst : EffectInstance ,
1882- deps : Array < mixed > | null,
1863+ destroy : ( ( ) => void ) | void ,
1864+ deps : Array < mixed > | void | null,
18831865): Effect {
18841866 const effect : Effect = {
18851867 tag,
18861868 create,
1887- inst ,
1869+ destroy ,
18881870 deps,
18891871 // Circular
18901872 next : ( null : any ) ,
@@ -1909,10 +1891,6 @@ function pushEffect(
19091891 return effect;
19101892}
19111893
1912- function createEffectInstance ( ) : EffectInstance {
1913- return { destroy : undefined } ;
1914- }
1915-
19161894let stackContainsErrorMessage : boolean | null = null ;
19171895
19181896function getCallerStackFrame ( ) : string {
@@ -2016,7 +1994,7 @@ function mountEffectImpl(
20161994 hook . memoizedState = pushEffect (
20171995 HookHasEffect | hookFlags ,
20181996 create ,
2019- createEffectInstance ( ) ,
1997+ undefined ,
20201998 nextDeps ,
20211999 ) ;
20222000}
@@ -2029,16 +2007,16 @@ function updateEffectImpl(
20292007): void {
20302008 const hook = updateWorkInProgressHook ( ) ;
20312009 const nextDeps = deps === undefined ? null : deps ;
2032- const effect : Effect = hook . memoizedState ;
2033- const inst = effect . inst ;
2010+ let destroy = undefined ;
20342011
20352012 // currentHook is null when rerendering after a render phase state update.
20362013 if ( currentHook !== null ) {
2014+ const prevEffect = currentHook . memoizedState ;
2015+ destroy = prevEffect . destroy ;
20372016 if ( nextDeps !== null ) {
2038- const prevEffect : Effect = currentHook . memoizedState ;
20392017 const prevDeps = prevEffect . deps ;
20402018 if ( areHookInputsEqual ( nextDeps , prevDeps ) ) {
2041- hook . memoizedState = pushEffect ( hookFlags , create , inst , nextDeps ) ;
2019+ hook . memoizedState = pushEffect ( hookFlags , create , destroy , nextDeps ) ;
20422020 return ;
20432021 }
20442022 }
@@ -2049,7 +2027,7 @@ function updateEffectImpl(
20492027 hook.memoizedState = pushEffect(
20502028 HookHasEffect | hookFlags,
20512029 create,
2052- inst ,
2030+ destroy ,
20532031 nextDeps,
20542032 );
20552033}
0 commit comments