Skip to content

Commit

Permalink
chore: simplify process_effects (#15397)
Browse files Browse the repository at this point in the history
  • Loading branch information
Rich-Harris authored Feb 27, 2025
1 parent 8fb2fb7 commit be82332
Showing 1 changed file with 18 additions and 29 deletions.
47 changes: 18 additions & 29 deletions packages/svelte/src/internal/client/runtime.js
Original file line number Diff line number Diff line change
Expand Up @@ -748,68 +748,57 @@ export function schedule_effect(signal) {
* bitwise flag passed in only. The collected effects array will be populated with all the user
* effects to be flushed.
*
* @param {Effect} effect
* @param {Effect} root
* @returns {Effect[]}
*/
function process_effects(effect) {
function process_effects(root) {
/** @type {Effect[]} */
var effects = [];

var current_effect = effect.first;
var effect = root.first;

main_loop: while (current_effect !== null) {
var flags = current_effect.f;
while (effect !== null) {
var flags = effect.f;
var is_branch = (flags & BRANCH_EFFECT) !== 0;
var is_skippable_branch = is_branch && (flags & CLEAN) !== 0;
var sibling = current_effect.next;

if (!is_skippable_branch && (flags & INERT) === 0) {
if ((flags & EFFECT) !== 0) {
effects.push(current_effect);
effects.push(effect);
} else if (is_branch) {
current_effect.f ^= CLEAN;
effect.f ^= CLEAN;
} else {
// Ensure we set the effect to be the active reaction
// to ensure that unowned deriveds are correctly tracked
// because we're flushing the current effect
var previous_active_reaction = active_reaction;
try {
active_reaction = current_effect;
if (check_dirtiness(current_effect)) {
update_effect(current_effect);
active_reaction = effect;
if (check_dirtiness(effect)) {
update_effect(effect);
}
} catch (error) {
handle_error(error, current_effect, null, current_effect.ctx);
handle_error(error, effect, null, effect.ctx);
} finally {
active_reaction = previous_active_reaction;
}
}

var child = current_effect.first;
var child = effect.first;

if (child !== null) {
current_effect = child;
effect = child;
continue;
}
}

if (sibling === null) {
let parent = current_effect.parent;
var parent = effect.parent;
effect = effect.next;

while (parent !== null) {
if (effect === parent) {
break main_loop;
}
var parent_sibling = parent.next;
if (parent_sibling !== null) {
current_effect = parent_sibling;
continue main_loop;
}
parent = parent.parent;
}
while (effect === null && parent !== null) {
effect = parent.next;
parent = parent.parent;
}

current_effect = sibling;
}

return effects;
Expand Down

0 comments on commit be82332

Please sign in to comment.