From c202002cd94f60fefc5d758931e20dab1155089a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 25 Feb 2026 22:18:03 -0500 Subject: [PATCH] chore: null out current_batch before committing branches --- .changeset/vast-ties-wash.md | 5 +++++ .../src/internal/client/dom/blocks/branches.js | 9 +++++---- .../src/internal/client/reactivity/batch.js | 16 ++++++++-------- 3 files changed, 18 insertions(+), 12 deletions(-) create mode 100644 .changeset/vast-ties-wash.md diff --git a/.changeset/vast-ties-wash.md b/.changeset/vast-ties-wash.md new file mode 100644 index 0000000000..39c14b4a17 --- /dev/null +++ b/.changeset/vast-ties-wash.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +chore: null out current_batch before committing branches diff --git a/packages/svelte/src/internal/client/dom/blocks/branches.js b/packages/svelte/src/internal/client/dom/blocks/branches.js index 6b77903574..a8096e0a58 100644 --- a/packages/svelte/src/internal/client/dom/blocks/branches.js +++ b/packages/svelte/src/internal/client/dom/blocks/branches.js @@ -68,9 +68,10 @@ export class BranchManager { this.#transition = transition; } - #commit = () => { - var batch = /** @type {Batch} */ (current_batch); - + /** + * @param {Batch} batch + */ + #commit = (batch) => { // if this batch was made obsolete, bail if (!this.#batches.has(batch)) return; @@ -221,7 +222,7 @@ export class BranchManager { this.anchor = hydrate_node; } - this.#commit(); + this.#commit(batch); } } } diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index edaac0c37c..96209d3ee4 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -87,7 +87,7 @@ export class Batch { /** * When the batch is committed (and the DOM is updated), we need to remove old branches * and append new ones by calling the functions added inside (if/each/key/etc) blocks - * @type {Set<() => void>} + * @type {Set<(batch: Batch) => void>} */ #commit_callbacks = new Set(); @@ -207,19 +207,19 @@ export class Batch { reset_branch(e, t); } } else { + // If sources are written to, then work needs to happen in a separate batch, else prior sources would be mixed with + // newly updated sources, which could lead to infinite loops when effects run over and over again. + previous_batch = this; + current_batch = null; + // append/remove branches - for (const fn of this.#commit_callbacks) fn(); + for (const fn of this.#commit_callbacks) fn(this); this.#commit_callbacks.clear(); if (this.#pending === 0) { this.#commit(); } - // If sources are written to, then work needs to happen in a separate batch, else prior sources would be mixed with - // newly updated sources, which could lead to infinite loops when effects run over and over again. - previous_batch = this; - current_batch = null; - flush_queued_effects(render_effects); flush_queued_effects(effects); @@ -479,7 +479,7 @@ export class Batch { this.flush(); } - /** @param {() => void} fn */ + /** @param {(batch: Batch) => void} fn */ oncommit(fn) { this.#commit_callbacks.add(fn); }