From bf7730a34abd15da6f799d673e458f613c6fa134 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Fri, 1 Apr 2022 10:04:38 +0200 Subject: [PATCH] wip: try to create new root fiber instead of reusing it --- src/component/component_node.ts | 1 + src/component/fibers.ts | 67 ++++++++++++++++++++++------ tests/components/concurrency.test.ts | 4 +- 3 files changed, 58 insertions(+), 14 deletions(-) diff --git a/src/component/component_node.ts b/src/component/component_node.ts index 1b6605c2..5e441ec2 100644 --- a/src/component/component_node.ts +++ b/src/component/component_node.ts @@ -334,6 +334,7 @@ export class ComponentNode

implements VNode= 0) { + root.willPatch[index] = fiber; + } + } + if (node.patched.length) { + let index = root.patched.indexOf(current); + if (index >= 0) { + root.patched[index] = fiber; + } + } + + return fiber; } - if (fibersInError.has(current)) { - fibersInError.delete(current); - fibersInError.delete(root); - current.appliedToDom = false; - } - return current; + // let parent = current.parent; + // let fiber = new Fiber(node); + // return fiber; + + // cancelFibers(current.children); + // current.root = null; + // let root = current.root!; + // root.setCounter(root.counter + 1 - cancelFibers(current.children)); + // current.children = []; + // current.bdom = null; + // if (current === root) { + // root.reachedChildren = new WeakSet(); + // } + // if (fibersInError.has(current)) { + // fibersInError.delete(current); + // fibersInError.delete(root); + // current.appliedToDom = false; + // } + // return current; } const fiber = new RootFiber(node); fiber.root = fiber; @@ -70,6 +107,8 @@ function cancelFibers(fibers: Fiber[]): number { return result; } +(window as any).fibers = []; + export class Fiber { node: ComponentNode; bdom: BDom | null = null; @@ -81,6 +120,7 @@ export class Fiber { constructor(node: ComponentNode) { this.node = node; + (window as any).fibers.push(this); } render() { @@ -190,6 +230,7 @@ export class RootFiber extends Fiber { } setCounter(newValue: number) { + debugger; this.counter = newValue; if (newValue === 0) { this.node.app.scheduler.flush(); diff --git a/tests/components/concurrency.test.ts b/tests/components/concurrency.test.ts index daefa896..8df8d9cd 100644 --- a/tests/components/concurrency.test.ts +++ b/tests/components/concurrency.test.ts @@ -870,6 +870,7 @@ test("concurrent renderings scenario 2", async () => { "ComponentB:rendered", ]).toBeLogged(); + debugger; stateB.fromB = "c"; await nextTick(); expect(fixture.innerHTML).toBe("

1

1b

"); @@ -881,7 +882,7 @@ test("concurrent renderings scenario 2", async () => { defs[1].resolve(); // resolve rendering initiated in B await nextTick(); - expect(fixture.innerHTML).toBe("
2

2c

"); + debugger expect([ "ComponentC:willRender", "ComponentC:rendered", @@ -892,6 +893,7 @@ test("concurrent renderings scenario 2", async () => { "ComponentB:patched", "ComponentA:patched", ]).toBeLogged(); + expect(fixture.innerHTML).toBe("
2

2c

"); defs[0].resolve(); // resolve rendering initiated in A await nextTick();