chore: simplify component pop (#16331)

* chore: simplify pop

* shuffle

* remove .m flag on component context

* unused

* shuffle

* simplify

* context is never null in pop

* changeset
pull/16336/head
Rich Harris 2 months ago committed by GitHub
parent 0cafe34c92
commit 8da222f460
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -0,0 +1,5 @@
---
'svelte': patch
---
chore: simplify internal component `pop()`

@ -143,7 +143,6 @@ export function push(props, runes = false, fn) {
p: component_context, p: component_context,
c: null, c: null,
e: null, e: null,
m: false,
s: props, s: props,
x: null, x: null,
l: null l: null
@ -171,37 +170,28 @@ export function push(props, runes = false, fn) {
* @returns {T} * @returns {T}
*/ */
export function pop(component) { export function pop(component) {
const context_stack_item = component_context; var context = /** @type {ComponentContext} */ (component_context);
if (context_stack_item !== null) { var effects = context.e;
if (component !== undefined) {
context_stack_item.x = component; if (effects !== null) {
} context.e = null;
const component_effects = context_stack_item.e;
if (component_effects !== null) { for (var fn of effects) {
var previous_effect = active_effect; create_user_effect(fn);
var previous_reaction = active_reaction;
context_stack_item.e = null;
try {
for (var i = 0; i < component_effects.length; i++) {
var component_effect = component_effects[i];
set_active_effect(component_effect.effect);
set_active_reaction(component_effect.reaction);
create_user_effect(component_effect.fn);
}
} finally {
set_active_effect(previous_effect);
set_active_reaction(previous_reaction);
}
}
component_context = context_stack_item.p;
if (DEV) {
dev_current_component_function = context_stack_item.p?.function ?? null;
} }
context_stack_item.m = true;
} }
// Micro-optimization: Don't set .a above to the empty object
// so it can be garbage-collected when the return here is unused if (component !== undefined) {
return component || /** @type {T} */ ({}); context.x = component;
}
component_context = context.p;
if (DEV) {
dev_current_component_function = component_context?.function ?? null;
}
return component ?? /** @type {T} */ ({});
} }
/** @returns {boolean} */ /** @returns {boolean} */

@ -179,28 +179,18 @@ export function teardown(fn) {
export function user_effect(fn) { export function user_effect(fn) {
validate_effect('$effect'); validate_effect('$effect');
// Non-nested `$effect(...)` in a component should be deferred
// until the component is mounted
var defer =
active_effect !== null &&
(active_effect.f & BRANCH_EFFECT) !== 0 &&
component_context !== null &&
!component_context.m;
if (DEV) { if (DEV) {
define_property(fn, 'name', { define_property(fn, 'name', {
value: '$effect' value: '$effect'
}); });
} }
if (defer) { if (!active_reaction && active_effect && (active_effect.f & BRANCH_EFFECT) !== 0) {
// Top-level `$effect(...)` in a component — defer until mount
var context = /** @type {ComponentContext} */ (component_context); var context = /** @type {ComponentContext} */ (component_context);
(context.e ??= []).push({ (context.e ??= []).push(fn);
fn,
effect: active_effect,
reaction: active_reaction
});
} else { } else {
// Everything else — create immediately
return create_user_effect(fn); return create_user_effect(fn);
} }
} }

@ -15,13 +15,7 @@ export type ComponentContext = {
/** context */ /** context */
c: null | Map<unknown, unknown>; c: null | Map<unknown, unknown>;
/** deferred effects */ /** deferred effects */
e: null | Array<{ e: null | Array<() => void | (() => void)>;
fn: () => void | (() => void);
effect: null | Effect;
reaction: null | Reaction;
}>;
/** mounted */
m: boolean;
/** /**
* props needed for legacy mode lifecycle functions, and for `createEventDispatcher` * props needed for legacy mode lifecycle functions, and for `createEventDispatcher`
* @deprecated remove in 6.0 * @deprecated remove in 6.0

Loading…
Cancel
Save