Skip to content

Commit 7b7bb60

Browse files
Merge pull request #20996 from NullVoxPopuli/nvp/renderComponent/cannot-read-properties-of-null-reading-syscall
Fix; renderComponent error: 'Cannot read property of undefined: reading syscall'
2 parents c5f4f3b + 2f3fd71 commit 7b7bb60

2 files changed

Lines changed: 51 additions & 5 deletions

File tree

packages/@ember/-internals/glimmer/tests/integration/components/render-component-test.ts

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,51 @@ moduleFor(
637637

638638
assertHTML('');
639639
}
640+
641+
async '@test async rendering multiple times to adjacent elements'() {
642+
let Child = defComponent(`Hi`, { scope: {} });
643+
let get = (id: string) => this.element.querySelector(id);
644+
let promises: Promise<unknown>[] = [];
645+
646+
function render(Comp: GlimmerishComponent, id: string, owner: Owner) {
647+
let promise = (async () => {
648+
await Promise.resolve();
649+
let element = get(`#${id}`);
650+
651+
renderComponent(Comp, {
652+
into: element!,
653+
owner,
654+
});
655+
})();
656+
657+
promises.push(promise);
658+
659+
return;
660+
}
661+
let A = defComponent('a:<Child />', { scope: { Child } });
662+
let B = defComponent('b:<Child />', { scope: { Child } });
663+
let Root = defComponent(
664+
[
665+
`<div id="a"></div><br>`,
666+
`<div id="b"></div>`,
667+
`{{render A 'a' owner}}`,
668+
`{{render B 'b' owner}}`,
669+
].join('\n'),
670+
{ scope: { render, A, B, owner: this.owner } }
671+
);
672+
673+
this.renderComponent(Root, {
674+
expect: [`<div id="a"></div><br>`, `<div id="b"></div>`, ``, ``].join('\n'),
675+
});
676+
677+
await Promise.all(promises);
678+
679+
assertHTML([`<div id="a">a:Hi</div><br>`, `<div id="b">b:Hi</div>`, ``, ``].join('\n'));
680+
681+
run(() => destroy(this));
682+
683+
assertHTML('');
684+
}
640685
}
641686
);
642687

packages/@glimmer/opcode-compiler/lib/compilable-template.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import type {
99
HandleResult,
1010
HighLevelOp,
1111
LayoutWithContext,
12-
Nullable,
1312
SerializedBlock,
1413
SerializedInlineBlock,
1514
Statement,
@@ -37,7 +36,7 @@ class CompilableTemplateImpl<S extends SymbolTable> implements CompilableTemplat
3736
}
3837
}
3938

40-
compiled: Nullable<HandleResult> = null;
39+
compiled: WeakMap<EvaluationContext, HandleResult> = new WeakMap();
4140

4241
constructor(
4342
readonly statements: WireFormat.Statement[],
@@ -70,14 +69,16 @@ function maybeCompile(
7069
compilable: CompilableTemplateImpl<SymbolTable>,
7170
context: EvaluationContext
7271
): HandleResult {
73-
if (compilable.compiled !== null) return compilable.compiled;
72+
if (compilable.compiled.has(context)) {
73+
return compilable.compiled.get(context) as HandleResult;
74+
}
7475

75-
compilable.compiled = PLACEHOLDER_HANDLE;
76+
compilable.compiled.set(context, PLACEHOLDER_HANDLE);
7677

7778
let { statements, meta } = compilable;
7879

7980
let result = compileStatements(statements, meta, context);
80-
compilable.compiled = result;
81+
compilable.compiled.set(context, result);
8182

8283
return result;
8384
}

0 commit comments

Comments
 (0)