tidy up types, fix duplication

pull/16131/head
Rich Harris 3 months ago
parent 0368635ce8
commit 158a242f90

@ -6,14 +6,14 @@ import { DERIVED, PROXY_PATH_SYMBOL, STATE_SYMBOL } from '#client/constants';
import { effect_tracking } from '../reactivity/effects.js'; import { effect_tracking } from '../reactivity/effects.js';
import { active_reaction, captured_signals, set_captured_signals, untrack } from '../runtime.js'; import { active_reaction, captured_signals, set_captured_signals, untrack } from '../runtime.js';
/** @type {{ reaction: Reaction | null, entries: Map<any, any> } | null} */ /** @type {{ reaction: Reaction | null, entries: Map<Value, Error[]> } | null} */
export let tracing_expressions = null; export let tracing_expressions = null;
/** /**
* @param {Value} signal * @param {Value} signal
* @param { { read: Error[] } } [entry] * @param {Error[]} [traces]
*/ */
function log_entry(signal, entry) { function log_entry(signal, traces = []) {
const debug = signal.debug; const debug = signal.debug;
const value = signal.trace_need_increase ? signal.trace_v : signal.v; const value = signal.trace_need_increase ? signal.trace_v : signal.v;
@ -74,13 +74,9 @@ function log_entry(signal, entry) {
console.log(signal.updated); console.log(signal.updated);
} }
const read = entry?.read; for (var trace of traces) {
if (read && read.length > 0) {
for (var stack of read) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log(stack); console.log(trace);
}
} }
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
@ -116,8 +112,8 @@ export function trace(label, fn) {
tracing_expressions = null; tracing_expressions = null;
for (const [signal, entry] of entries) { for (const [signal, traces] of entries) {
log_entry(signal, entry); log_entry(signal, traces);
} }
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.groupEnd(); console.groupEnd();

@ -783,14 +783,23 @@ export function get(signal) {
if (signal.debug) { if (signal.debug) {
signal.debug(); signal.debug();
} else if (signal.created) { } else if (signal.created) {
var entry = tracing_expressions.entries.get(signal); var trace = get_stack('TracedAt');
if (entry === undefined) { if (trace) {
entry = { read: [] }; var traces = tracing_expressions.entries.get(signal);
tracing_expressions.entries.set(signal, entry);
if (traces === undefined) {
tracing_expressions.entries.set(signal, (traces = []));
} }
entry.read.push(get_stack('TracedAt')); var last = traces.at(-1);
// traces can be duplicated, e.g. by `snapshot` invoking both
// both `getOwnPropertyDescriptor` and `get` traps at once
if (trace.stack !== last?.stack) {
traces.push(trace);
}
}
} }
} }

Loading…
Cancel
Save