incremental-batches
Rich Harris 4 weeks ago
parent afa5af06c9
commit d0b8903d90

@ -315,9 +315,9 @@ export function destroy_derived_effects(derived) {
/**
* The currently updating deriveds, used to detect infinite recursion
* in dev mode and provide a nicer error than 'too much recursion'
* @type {Derived[]}
* @type {Derived[] | null}
*/
let stack = [];
export let derived_stack = null;
/**
* @param {Derived} derived
@ -347,31 +347,32 @@ export function execute_derived(derived) {
set_active_effect(get_derived_parent_effect(derived));
derived_stack ??= [];
if (DEV) {
// TODO don't we need eager effects in prod too?
let prev_eager_effects = eager_effects;
set_eager_effects(new Set());
try {
if (includes.call(stack, derived)) {
e.derived_references_self();
}
stack.push(derived);
try {
derived_stack.push(derived);
derived.f &= ~WAS_MARKED;
destroy_derived_effects(derived);
value = update_reaction(derived);
} finally {
set_active_effect(prev_active_effect);
set_eager_effects(prev_eager_effects);
stack.pop();
derived_stack.pop();
}
} else {
try {
derived_stack.push(derived);
derived.f &= ~WAS_MARKED;
destroy_derived_effects(derived);
value = update_reaction(derived);
} finally {
set_active_effect(prev_active_effect);
derived_stack.pop();
}
}

@ -32,7 +32,8 @@ import {
freeze_derived_effects,
recent_async_deriveds,
unfreeze_derived_effects,
update_derived
update_derived,
derived_stack
} from './reactivity/deriveds.js';
import { async_mode_flag, tracing_mode_flag } from '../flags/index.js';
import { tracing_expressions } from './dev/tracing.js';
@ -62,6 +63,7 @@ import { UNINITIALIZED } from '../../constants.js';
import { captured_signals } from './legacy.js';
import { without_reactive_context } from './dom/elements/bindings/shared.js';
import * as w from './warnings.js';
import * as e from './errors.js';
let is_updating_effect = false;
@ -634,6 +636,10 @@ export function get(signal) {
if (is_derived) {
var derived = /** @type {Derived} */ (signal);
if (derived_stack !== null && includes.call(derived_stack, derived)) {
e.derived_references_self();
}
if (is_destroying_effect) {
var value = derived.v;

Loading…
Cancel
Save