@@ -13,7 +13,6 @@ export type Setter<T> = undefined extends T
1313export type Signal < T > = [ get : Accessor < T > , set : Setter < T > ] ;
1414
1515const ERROR = Symbol ( "error" ) ;
16- export const BRANCH = Symbol ( "branch" ) ;
1716export function castError ( err : any ) {
1817 if ( err instanceof Error || typeof err === "string" ) return err ;
1918 return new Error ( "Unknown error" ) ;
@@ -26,12 +25,23 @@ function handleError(err: any) {
2625 for ( const f of fns ) f ( err ) ;
2726}
2827
29- const UNOWNED : Owner = { context : null , owner : null } ;
28+ const UNOWNED : Owner = { context : null , owner : null , owned : null , cleanups : null } ;
3029export let Owner : Owner | null = null ;
3130
3231interface Owner {
3332 owner : Owner | null ;
3433 context : any | null ;
34+ owned : Owner [ ] | null ;
35+ cleanups : ( ( ) => void ) [ ] | null ;
36+ }
37+
38+ export function createOwner ( ) : Owner {
39+ const o = { owner : Owner , context : null , owned : null , cleanups : null } ;
40+ if ( Owner ) {
41+ if ( ! Owner . owned ) Owner . owned = [ o ] ;
42+ else Owner . owned . push ( o ) ;
43+ }
44+ return o ;
3545}
3646
3747export function createRoot < T > ( fn : ( dispose : ( ) => void ) => T , detachedOwner ?: typeof Owner ) : T {
@@ -41,12 +51,14 @@ export function createRoot<T>(fn: (dispose: () => void) => T, detachedOwner?: ty
4151 ? UNOWNED
4252 : {
4353 context : null ,
44- owner : detachedOwner === undefined ? owner : detachedOwner
54+ owner : detachedOwner === undefined ? owner : detachedOwner ,
55+ owned : null ,
56+ cleanups : null
4557 } ;
4658 Owner = root ;
4759 let result : T ;
4860 try {
49- result = fn ( ( ) => { } ) ;
61+ result = fn ( fn . length === 0 ? ( ) => { } : ( ) => cleanNode ( root ) ) ;
5062 } catch ( err ) {
5163 handleError ( err ) ;
5264 } finally {
@@ -68,7 +80,7 @@ export function createSignal<T>(
6880}
6981
7082export function createComputed < T > ( fn : ( v ?: T ) => T , value ?: T ) : void {
71- Owner = { owner : Owner , context : null } ;
83+ Owner = createOwner ( ) ;
7284 try {
7385 fn ( value ) ;
7486 } catch ( err ) {
@@ -89,7 +101,7 @@ export function createReaction(fn: () => void) {
89101}
90102
91103export function createMemo < T > ( fn : ( v ?: T ) => T , value ?: T ) : ( ) => T {
92- Owner = { owner : Owner , context : null } ;
104+ Owner = createOwner ( ) ;
93105 let v : T ;
94106 try {
95107 v = fn ( value ) ;
@@ -136,18 +148,21 @@ export function on<T, U>(
136148export function onMount ( fn : ( ) => void ) { }
137149
138150export function onCleanup ( fn : ( ) => void ) {
139- let node ;
140- if ( Owner && ( node = lookup ( Owner , BRANCH ) ) ) {
141- if ( ! node . cleanups ) node . cleanups = [ fn ] ;
142- else node . cleanups . push ( fn ) ;
151+ if ( Owner ) {
152+ if ( ! Owner . cleanups ) Owner . cleanups = [ fn ] ;
153+ else Owner . cleanups . push ( fn ) ;
143154 }
144155 return fn ;
145156}
146157
147- export function cleanNode ( node : { cleanups ?: Function [ ] | null } ) {
158+ export function cleanNode ( node : Owner ) {
159+ if ( node . owned ) {
160+ for ( let i = 0 ; i < node . owned . length ; i ++ ) cleanNode ( node . owned [ i ] ) ;
161+ node . owned = null ;
162+ }
148163 if ( node . cleanups ) {
149164 for ( let i = 0 ; i < node . cleanups . length ; i ++ ) node . cleanups [ i ] ( ) ;
150- node . cleanups = undefined ;
165+ node . cleanups = null ;
151166 }
152167}
153168
0 commit comments