chore: use update_derived_status instead of set_signal_status where appropriate (#17442)

Co-authored-by: David Roizenman <hmnd@users.noreply.github.com>
pull/17443/head
Rich Harris 8 months ago committed by GitHub
parent c6ce1ffeff
commit f04f22ea49
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -36,7 +36,7 @@ import { UNINITIALIZED } from '../../../constants.js';
import { batch_values, current_batch } from './batch.js'; import { batch_values, current_batch } from './batch.js';
import { unset_context } from './async.js'; import { unset_context } from './async.js';
import { deferred } from '../../shared/utils.js'; import { deferred } from '../../shared/utils.js';
import { set_signal_status } from './status.js'; import { update_derived_status } from './status.js';
/** @type {Effect | null} */ /** @type {Effect | null} */
export let current_async_effect = null; export let current_async_effect = null;
@ -385,7 +385,6 @@ export function update_derived(derived) {
batch_values.set(derived, value); batch_values.set(derived, value);
} }
} else { } else {
var status = (derived.f & CONNECTED) === 0 ? MAYBE_DIRTY : CLEAN; update_derived_status(derived);
set_signal_status(derived, status);
} }
} }

@ -39,7 +39,7 @@ import { component_context, is_runes } from '../context.js';
import { Batch, batch_values, eager_block_effects, schedule_effect } from './batch.js'; import { Batch, batch_values, eager_block_effects, schedule_effect } from './batch.js';
import { proxy } from '../proxy.js'; import { proxy } from '../proxy.js';
import { execute_derived } from './deriveds.js'; import { execute_derived } from './deriveds.js';
import { set_signal_status } from './status.js'; import { set_signal_status, update_derived_status } from './status.js';
/** @type {Set<any>} */ /** @type {Set<any>} */
export let eager_effects = new Set(); export let eager_effects = new Set();
@ -218,12 +218,14 @@ export function internal_set(source, value) {
} }
if ((source.f & DERIVED) !== 0) { if ((source.f & DERIVED) !== 0) {
const derived = /** @type {Derived} */ (source);
// if we are assigning to a dirty derived we set it to clean/maybe dirty but we also eagerly execute it to track the dependencies // if we are assigning to a dirty derived we set it to clean/maybe dirty but we also eagerly execute it to track the dependencies
if ((source.f & DIRTY) !== 0) { if ((source.f & DIRTY) !== 0) {
execute_derived(/** @type {Derived} */ (source)); execute_derived(derived);
} }
set_signal_status(source, (source.f & CONNECTED) !== 0 ? CLEAN : MAYBE_DIRTY); update_derived_status(derived);
} }
source.wv = increment_write_version(); source.wv = increment_write_version();

@ -1,5 +1,5 @@
/** @import { Signal } from '#client' */ /** @import { Derived, Signal } from '#client' */
import { CLEAN, DIRTY, MAYBE_DIRTY } from '#client/constants'; import { CLEAN, CONNECTED, DIRTY, MAYBE_DIRTY } from '#client/constants';
const STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN); const STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN);
@ -10,3 +10,16 @@ const STATUS_MASK = ~(DIRTY | MAYBE_DIRTY | CLEAN);
export function set_signal_status(signal, status) { export function set_signal_status(signal, status) {
signal.f = (signal.f & STATUS_MASK) | status; signal.f = (signal.f & STATUS_MASK) | status;
} }
/**
* Set a derived's status to CLEAN or MAYBE_DIRTY based on its connection state.
* @param {Derived} derived
*/
export function update_derived_status(derived) {
// Only mark as MAYBE_DIRTY if disconnected and has dependencies.
if ((derived.f & CONNECTED) !== 0 || derived.deps === null) {
set_signal_status(derived, CLEAN);
} else {
set_signal_status(derived, MAYBE_DIRTY);
}
}

@ -56,7 +56,7 @@ import { handle_error } from './error-handling.js';
import { UNINITIALIZED } from '../../constants.js'; import { UNINITIALIZED } from '../../constants.js';
import { captured_signals } from './legacy.js'; import { captured_signals } from './legacy.js';
import { without_reactive_context } from './dom/elements/bindings/shared.js'; import { without_reactive_context } from './dom/elements/bindings/shared.js';
import { set_signal_status } from './reactivity/status.js'; import { set_signal_status, update_derived_status } from './reactivity/status.js';
export let is_updating_effect = false; export let is_updating_effect = false;
@ -375,16 +375,20 @@ function remove_reaction(signal, dependency) {
// allows us to skip the expensive work of disconnecting and immediately reconnecting it // allows us to skip the expensive work of disconnecting and immediately reconnecting it
(new_deps === null || !new_deps.includes(dependency)) (new_deps === null || !new_deps.includes(dependency))
) { ) {
set_signal_status(dependency, MAYBE_DIRTY); const derived = /** @type {Derived} */ (dependency);
// If we are working with a derived that is owned by an effect, then mark it as being // If we are working with a derived that is owned by an effect, then mark it as being
// disconnected and remove the mark flag, as it cannot be reliably removed otherwise // disconnected and remove the mark flag, as it cannot be reliably removed otherwise
if ((dependency.f & CONNECTED) !== 0) { if ((derived.f & CONNECTED) !== 0) {
dependency.f ^= CONNECTED; derived.f ^= CONNECTED;
dependency.f &= ~WAS_MARKED; derived.f &= ~WAS_MARKED;
} }
update_derived_status(derived);
// Disconnect any reactions owned by this reaction // Disconnect any reactions owned by this reaction
destroy_derived_effects(/** @type {Derived} **/ (dependency)); destroy_derived_effects(derived);
remove_reactions(/** @type {Derived} **/ (dependency), 0); remove_reactions(derived, 0);
} }
} }

Loading…
Cancel
Save