From: Evan You Date: Fri, 13 Sep 2024 10:34:59 +0000 (+0800) Subject: fix(reactivity): properly clean up deps, fix memory leak X-Git-Tag: v3.5.5~7 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8ea5d6d6981ab7febda0be43c3c92b18869c3a2a;p=thirdparty%2Fvuejs%2Fcore.git fix(reactivity): properly clean up deps, fix memory leak close #11901 --- diff --git a/packages/reactivity/src/effect.ts b/packages/reactivity/src/effect.ts index 32ea8ee0c8..0c05e06075 100644 --- a/packages/reactivity/src/effect.ts +++ b/packages/reactivity/src/effect.ts @@ -208,6 +208,23 @@ export class ReactiveEffect } } +/** + * For debugging + */ +// function printDeps(sub: Subscriber) { +// let d = sub.deps +// let ds = [] +// while (d) { +// ds.push(d) +// d = d.nextDep +// } +// return ds.map(d => ({ +// id: d.id, +// prev: d.prevDep?.id, +// next: d.nextDep?.id, +// })) +// } + let batchDepth = 0 let batchedEffect: ReactiveEffect | undefined @@ -265,9 +282,11 @@ function cleanupDeps(sub: Subscriber) { // Cleanup unsued deps let head let tail = sub.depsTail - for (let link = tail; link; link = link.prevDep) { + let link = tail + while (link) { + const prev = link.prevDep if (link.version === -1) { - if (link === tail) tail = link.prevDep + if (link === tail) tail = prev // unused - remove it from the dep's subscribing effect list removeSub(link) // also remove it from this effect's dep list @@ -281,6 +300,7 @@ function cleanupDeps(sub: Subscriber) { // restore previous active link if any link.dep.activeLink = link.prevActiveLink link.prevActiveLink = undefined + link = prev } // set the new head & tail sub.deps = head