|
|
|
|
@ -36,7 +36,13 @@ const FLUSH_SYNC = 1;
|
|
|
|
|
let current_scheduler_mode = FLUSH_MICROTASK;
|
|
|
|
|
// Used for handling scheduling
|
|
|
|
|
let is_micro_task_queued = false;
|
|
|
|
|
let is_flushing_effect = false;
|
|
|
|
|
export let is_flushing_effect = false;
|
|
|
|
|
|
|
|
|
|
/** @param {boolean} value */
|
|
|
|
|
export function set_is_flushing_effect(value) {
|
|
|
|
|
is_flushing_effect = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Used for $inspect
|
|
|
|
|
export let is_batching_effect = false;
|
|
|
|
|
let is_inspecting_signal = false;
|
|
|
|
|
@ -466,27 +472,18 @@ function process_microtask() {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param {import('./types.js').Effect} signal
|
|
|
|
|
* @param {boolean} sync
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
export function schedule_effect(signal, sync) {
|
|
|
|
|
export function schedule_effect(signal) {
|
|
|
|
|
const flags = signal.f;
|
|
|
|
|
if (sync) {
|
|
|
|
|
const previously_flushing_effect = is_flushing_effect;
|
|
|
|
|
try {
|
|
|
|
|
is_flushing_effect = true;
|
|
|
|
|
execute_effect(signal);
|
|
|
|
|
set_signal_status(signal, CLEAN);
|
|
|
|
|
} finally {
|
|
|
|
|
is_flushing_effect = previously_flushing_effect;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
if (current_scheduler_mode === FLUSH_MICROTASK) {
|
|
|
|
|
if (!is_micro_task_queued) {
|
|
|
|
|
is_micro_task_queued = true;
|
|
|
|
|
queueMicrotask(process_microtask);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((flags & EFFECT) !== 0) {
|
|
|
|
|
current_queued_effects.push(signal);
|
|
|
|
|
// Prevent any nested user effects from potentially triggering
|
|
|
|
|
@ -544,9 +541,6 @@ export function schedule_effect(signal, sync) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
signal.f |= EFFECT_RAN;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
@ -696,7 +690,7 @@ export function get(signal) {
|
|
|
|
|
current_untracked_writes.includes(signal)
|
|
|
|
|
) {
|
|
|
|
|
set_signal_status(current_effect, DIRTY);
|
|
|
|
|
schedule_effect(current_effect, false);
|
|
|
|
|
schedule_effect(current_effect);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -772,7 +766,7 @@ export function mark_subtree_inert(signal, inert) {
|
|
|
|
|
if (is_already_inert !== inert) {
|
|
|
|
|
signal.f ^= INERT;
|
|
|
|
|
if (!inert && (flags & CLEAN) === 0) {
|
|
|
|
|
schedule_effect(signal, false);
|
|
|
|
|
schedule_effect(signal);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -819,7 +813,7 @@ export function mark_reactions(signal, to_status, force_schedule) {
|
|
|
|
|
force_schedule
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
schedule_effect(/** @type {import('#client').Effect} */ (reaction), false);
|
|
|
|
|
schedule_effect(/** @type {import('#client').Effect} */ (reaction));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -1075,7 +1069,7 @@ export function pop(component) {
|
|
|
|
|
if (effects !== null) {
|
|
|
|
|
context_stack_item.e = null;
|
|
|
|
|
for (let i = 0; i < effects.length; i++) {
|
|
|
|
|
schedule_effect(effects[i], false);
|
|
|
|
|
schedule_effect(effects[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
current_component_context = context_stack_item.p;
|
|
|
|
|
|