forking-hell
Rich Harris 6 days ago
parent 739f5fc1c6
commit d8df737f56

@ -143,8 +143,17 @@ export class Batch {
this.apply(); this.apply();
/** @type {EffectTarget} */
var target = {
parent: null,
effect: null,
effects: [],
render_effects: [],
block_effects: []
};
for (const root of root_effects) { for (const root of root_effects) {
this.#traverse_effect_tree(root); this.#traverse_effect_tree(root, target);
} }
// if there is no outstanding async work, commit // if there is no outstanding async work, commit
@ -155,22 +164,33 @@ export class Batch {
this.#commit(); this.#commit();
// If sources are written to, then work needs to happen in a separate batch, else prior sources would be mixed with
// newly updated sources, which could lead to infinite loops when effects run over and over again.
previous_batch = this;
current_batch = null;
// batch_values = previous_batch_sources; // batch_values = previous_batch_sources;
// flush_queued_effects(target.render_effects); // flush_queued_effects(target.render_effects);
// flush_queued_effects(target.effects); // flush_queued_effects(target.effects);
previous_batch = null;
} else { } else {
// this.#defer_effects(target.render_effects); // this.#defer_effects(target.render_effects);
// this.#defer_effects(target.effects); // this.#defer_effects(target.effects);
// this.#defer_effects(target.block_effects); // this.#defer_effects(target.block_effects);
} }
if (this.#blocking_pending > 0) {
this.#defer_effects(target.effects);
this.#defer_effects(target.render_effects);
this.#defer_effects(target.block_effects);
} else {
// TODO append/detach blocks here as well, not in #commit
// If sources are written to, then work needs to happen in a separate batch, else prior sources would be mixed with
// newly updated sources, which could lead to infinite loops when effects run over and over again.
previous_batch = this;
current_batch = null;
flush_queued_effects(target.render_effects);
flush_queued_effects(target.effects);
previous_batch = null;
}
batch_values = null; batch_values = null;
} }
@ -178,19 +198,11 @@ export class Batch {
* Traverse the effect tree, executing effects or stashing * Traverse the effect tree, executing effects or stashing
* them for later execution as appropriate * them for later execution as appropriate
* @param {Effect} root * @param {Effect} root
* @param {EffectTarget} target
*/ */
#traverse_effect_tree(root) { #traverse_effect_tree(root, target) {
root.f ^= CLEAN; root.f ^= CLEAN;
/** @type {EffectTarget} */
var target = {
parent: null,
effect: null,
effects: [],
render_effects: [],
block_effects: []
};
var effect = root.first; var effect = root.first;
while (effect !== null) { while (effect !== null) {
@ -249,16 +261,6 @@ export class Batch {
parent = parent.parent; parent = parent.parent;
} }
} }
if (this.#blocking_pending > 0) {
this.#defer_effects(target.effects);
this.#defer_effects(target.render_effects);
this.#defer_effects(target.block_effects);
} else {
// TODO append/detach blocks here as well
flush_queued_effects(target.render_effects);
flush_queued_effects(target.effects);
}
} }
/** /**
@ -343,6 +345,15 @@ export class Batch {
let is_earlier = true; let is_earlier = true;
/** @type {EffectTarget} */
var dummy_target = {
parent: null,
effect: null,
effects: [],
render_effects: [],
block_effects: []
};
for (const batch of batches) { for (const batch of batches) {
if (batch === this) { if (batch === this) {
is_earlier = false; is_earlier = false;
@ -383,9 +394,11 @@ export class Batch {
batch.apply(); batch.apply();
for (const root of queued_root_effects) { for (const root of queued_root_effects) {
batch.#traverse_effect_tree(root); batch.#traverse_effect_tree(root, dummy_target);
} }
// TODO do we need to do anything with `target`? defer block effects?
queued_root_effects = []; queued_root_effects = [];
batch.deactivate(); batch.deactivate();
} }

Loading…
Cancel
Save