From 28cef32e694d24c7018970688d81148365525f72 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 30 Apr 2025 18:31:21 +0100 Subject: [PATCH] Restore truedm commit: chore: avoid microtasks when flushing sync # Conflicts: # packages/svelte/src/internal/client/runtime.js --- .../svelte/src/internal/client/runtime.js | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index c9c273b6fa..4c6996db39 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -47,6 +47,7 @@ const handled_errors = new WeakSet(); let is_throwing_error = false; let is_flushing = false; +let is_flushing_sync = false; /** @type {Effect | null} */ let last_scheduled_effect = null; @@ -734,7 +735,9 @@ function flush_queued_effects(effects) { export function schedule_effect(signal) { if (!is_flushing) { is_flushing = true; - queueMicrotask(flush_queued_root_effects); + if (!is_flushing_sync) { + queueMicrotask(flush_queued_root_effects); + } } var effect = (last_scheduled_effect = signal); @@ -818,23 +821,30 @@ function process_effects(root) { * @returns {T} */ export function flushSync(fn) { - var result; - - if (fn) { - is_flushing = true; - flush_queued_root_effects(); - result = fn(); - } + var previously_flushing_sync = is_flushing_sync; - while (true) { - flush_tasks(); + try { + var result; + is_flushing_sync = true; - if (queued_root_effects.length === 0) { - return /** @type {T} */ (result); + if (fn) { + is_flushing = true; + flush_queued_root_effects(); + result = fn(); } - is_flushing = true; - flush_queued_root_effects(); + while (true) { + flush_tasks(); + + if (queued_root_effects.length === 0) { + return /** @type {T} */ (result); + } + + is_flushing = true; + flush_queued_root_effects(); + } + } finally { + is_flushing_sync = previously_flushing_sync; } }