Skip to content

Commit 1eb3f12

Browse files
committed
refactor(system): add Link.get, Link.release
1 parent e30ce9a commit 1eb3f12

File tree

1 file changed

+54
-48
lines changed

1 file changed

+54
-48
lines changed

src/system.ts

Lines changed: 54 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,57 @@ export function endBatch() {
7575
}
7676

7777
export namespace Link {
78-
export let pool: Link | undefined = undefined;
78+
let pool: Link | undefined = undefined;
79+
80+
export function get(dep: Link['dep'], sub: Link['sub'], nextDep: Link | undefined) {
81+
if (pool !== undefined) {
82+
const newLink = pool;
83+
pool = newLink.nextDep;
84+
newLink.nextDep = nextDep;
85+
newLink.dep = dep;
86+
newLink.sub = sub;
87+
newLink.trackId = sub.trackId;
88+
return newLink;
89+
} else {
90+
return {
91+
dep,
92+
sub,
93+
trackId: sub.trackId,
94+
nextDep: nextDep,
95+
prevSub: undefined,
96+
nextSub: undefined,
97+
};
98+
}
99+
}
100+
101+
export function release(link: Link) {
102+
const dep = link.dep;
103+
const nextSub = link.nextSub;
104+
const prevSub = link.prevSub;
105+
106+
if (nextSub !== undefined) {
107+
nextSub.prevSub = prevSub;
108+
}
109+
if (prevSub !== undefined) {
110+
prevSub.nextSub = nextSub;
111+
}
112+
113+
if (nextSub === undefined) {
114+
dep.subsTail = prevSub;
115+
}
116+
if (prevSub === undefined) {
117+
dep.subs = nextSub;
118+
}
119+
120+
// @ts-ignore
121+
link.dep = undefined;
122+
// @ts-ignore
123+
link.sub = undefined;
124+
link.prevSub = undefined;
125+
link.nextSub = undefined;
126+
link.nextDep = pool;
127+
pool = link;
128+
}
79129
}
80130

81131
export namespace Dependency {
@@ -89,25 +139,7 @@ export namespace Dependency {
89139
: sub.deps;
90140

91141
if (old === undefined || old.dep !== dep) {
92-
let newLink: Link;
93-
94-
if (Link.pool !== undefined) {
95-
newLink = Link.pool;
96-
Link.pool = newLink.nextDep;
97-
newLink.nextDep = old;
98-
newLink.dep = dep;
99-
newLink.sub = sub;
100-
newLink.trackId = sub.trackId;
101-
} else {
102-
newLink = {
103-
dep,
104-
sub,
105-
trackId: sub.trackId,
106-
nextDep: old,
107-
prevSub: undefined,
108-
nextSub: undefined,
109-
};
110-
}
142+
const newLink = Link.get(dep, sub, old);
111143

112144
if (depsTail === undefined) {
113145
sub.deps = newLink;
@@ -403,34 +435,9 @@ export namespace Subscriber {
403435

404436
export function clearDependencies(link: Link) {
405437
do {
406-
const nextDep = link.nextDep;
407438
const dep = link.dep;
408-
const nextSub = link.nextSub;
409-
const prevSub = link.prevSub;
410-
411-
if (nextSub !== undefined) {
412-
nextSub.prevSub = prevSub;
413-
}
414-
if (prevSub !== undefined) {
415-
prevSub.nextSub = nextSub;
416-
}
417-
418-
if (nextSub === undefined) {
419-
dep.subsTail = prevSub;
420-
}
421-
if (prevSub === undefined) {
422-
dep.subs = nextSub;
423-
}
424-
425-
// @ts-ignore
426-
link.dep = undefined;
427-
// @ts-ignore
428-
link.sub = undefined;
429-
link.prevSub = undefined;
430-
link.nextSub = undefined;
431-
link.nextDep = Link.pool;
432-
Link.pool = link;
433-
439+
const nextDep = link.nextDep;
440+
Link.release(link);
434441
if (dep.subs === undefined && 'deps' in dep) {
435442
dep.dirtyLevel = DirtyLevels.Released;
436443
if (dep.deps !== undefined) {
@@ -441,7 +448,6 @@ export namespace Subscriber {
441448
continue;
442449
}
443450
}
444-
445451
link = nextDep!;
446452
} while (link !== undefined);
447453
}

0 commit comments

Comments
 (0)