pull/18709/merge
Samran Asif 2 days ago committed by GitHub
commit f2287a1185
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
fix: clear last scheduled effect reference in `destroy_effect` to prevent detached subtree memory leaks (#18623)

@ -67,6 +67,16 @@ export let batch_values = null;
/** @type {Effect | null} */
let last_scheduled_effect = null;
/**
* @param {Effect} effect
* @returns {void}
*/
export function clear_last_scheduled_effect(effect) {
if (last_scheduled_effect === effect) {
last_scheduled_effect = null;
}
}
export let is_flushing_sync = false;
let is_processing = false;

@ -43,7 +43,7 @@ import { DEV } from 'esm-env';
import { define_property } from '../../shared/utils.js';
import { get_next_sibling } from '../dom/operations.js';
import { component_context, dev_current_component_function, dev_stack } from '../context.js';
import { Batch, collected_effects, current_batch } from './batch.js';
import { Batch, clear_last_scheduled_effect, collected_effects, current_batch } from './batch.js';
import { flatten } from './async.js';
import { without_reactive_context } from '../dom/elements/bindings/shared.js';
import { set_signal_status } from './status.js';
@ -555,6 +555,8 @@ export function destroy_effect(effect, remove_dom = true) {
effect.component_function = null;
}
clear_last_scheduled_effect(effect);
// `first` and `child` are nulled out in destroy_effect_children
// we don't null out `parent` so that error propagation can work correctly
effect.next =

@ -1686,4 +1686,24 @@ describe('signals', () => {
pop();
}
});
test('destroy_effect clears scheduling and effect state (#18623)', () => {
return () => {
let s = state(0);
let e: Effect | undefined;
let destroy = effect_root(() => {
e = effect(() => {
$.get(s);
});
});
set(s, 1);
flushSync();
destroy();
assert.equal(e?.deps, null);
assert.equal(e?.fn, null);
};
});
});

Loading…
Cancel
Save