Skip to content

Commit 9c1533b

Browse files
committed
Fix: ContinuationRootNodeImpl should delegate to more RootNode methods
1 parent ba06f63 commit 9c1533b

File tree

1 file changed

+26
-19
lines changed

1 file changed

+26
-19
lines changed

truffle/src/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/bytecode/generator/BytecodeRootNodeElement.java

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,13 @@ final class BytecodeRootNodeElement extends CodeTypeElement {
541541
abstractBytecodeNode.add(new CodeVariableElement(Set.of(VOLATILE), arrayOf(type(byte.class)), "oldBytecodes"));
542542
}
543543

544-
// this should be at the end after all methods have been added.
544+
/*
545+
* These calls should occur after all methods have been added. They use the generated root
546+
* node's method set to determine what method delegate/stub methods to generate.
547+
*/
548+
if (model.hasYieldOperation()) {
549+
continuationRootNodeImpl.addRootNodeDelegateMethods();
550+
}
545551
if (model.enableSerialization) {
546552
addMethodStubsToSerializationRootNode();
547553
}
@@ -18976,9 +18982,6 @@ void lazyInit() {
1897618982
this.add(createIsCloningAllowed());
1897718983
this.add(createIsCloneUninitializedSupported());
1897818984
this.addOptional(createPrepareForCompilation());
18979-
// Should appear last. Uses current method set to determine which methods need to be
18980-
// implemented.
18981-
this.addAll(createRootNodeProxyMethods());
1898218985
}
1898318986

1898418987
private CodeExecutableElement createExecute() {
@@ -19143,14 +19146,20 @@ private CodeExecutableElement createPrepareForCompilation() {
1914319146
return ex;
1914419147
}
1914519148

19146-
private List<CodeExecutableElement> createRootNodeProxyMethods() {
19147-
List<CodeExecutableElement> result = new ArrayList<>();
19148-
19149-
List<ExecutableElement> existing = ElementFilter.methodsIn(continuationRootNodeImpl.getEnclosedElements());
19149+
private void addRootNodeDelegateMethods() {
19150+
List<ExecutableElement> existing = ElementFilter.methodsIn(this.getEnclosedElements());
1915019151

1915119152
List<ExecutableElement> excludes = List.of(
19153+
// Not supported (see isCloningAllowed, isCloneUninitializedSupported).
1915219154
ElementUtils.findMethod(types.RootNode, "copy"),
19153-
ElementUtils.findMethod(types.RootNode, "cloneUninitialized"));
19155+
ElementUtils.findMethod(types.RootNode, "cloneUninitialized"),
19156+
// User code can only obtain a continuation root by executing a yield.
19157+
// Parsing is done at this point, so the root is already prepared.
19158+
ElementUtils.findMethod(types.RootNode, "prepareForCall"),
19159+
// The instrumenter should already know about/have instrumented the root
19160+
// node by the time we try to instrument a continuation root.
19161+
ElementUtils.findMethod(types.RootNode, "isInstrumentable"),
19162+
ElementUtils.findMethod(types.RootNode, "prepareForInstrumentation"));
1915419163

1915519164
outer: for (ExecutableElement rootNodeMethod : ElementUtils.getOverridableMethods((TypeElement) types.RootNode.asElement())) {
1915619165
// Exclude methods we have already implemented.
@@ -19165,33 +19174,31 @@ private List<CodeExecutableElement> createRootNodeProxyMethods() {
1916519174
continue outer;
1916619175
}
1916719176
}
19168-
// Only proxy methods overridden by the template class or its parents.
19169-
ExecutableElement templateMethod = ElementUtils.findOverride(rootNodeMethod, model.templateType);
19177+
// Only delegate to methods overridden by the generated class or its parents.
19178+
ExecutableElement templateMethod = ElementUtils.findOverride(rootNodeMethod, BytecodeRootNodeElement.this);
1917019179
if (templateMethod == null) {
1917119180
continue outer;
1917219181
}
1917319182

19174-
CodeExecutableElement proxyMethod = GeneratorUtils.override(templateMethod);
19175-
CodeTreeBuilder b = proxyMethod.createBuilder();
19183+
CodeExecutableElement delegateMethod = GeneratorUtils.override(templateMethod);
19184+
CodeTreeBuilder b = delegateMethod.createBuilder();
1917619185

19177-
boolean isVoid = ElementUtils.isVoid(proxyMethod.getReturnType());
19186+
boolean isVoid = ElementUtils.isVoid(delegateMethod.getReturnType());
1917819187
if (isVoid) {
1917919188
b.startStatement();
1918019189
} else {
1918119190
b.startReturn();
1918219191
}
1918319192

19184-
b.startCall("root", rootNodeMethod.getSimpleName().toString());
19185-
for (VariableElement param : rootNodeMethod.getParameters()) {
19193+
b.startCall("root", templateMethod.getSimpleName().toString());
19194+
for (VariableElement param : templateMethod.getParameters()) {
1918619195
b.variable(param);
1918719196
}
1918819197
b.end(); // call
1918919198
b.end(); // statement / return
1919019199

19191-
result.add(proxyMethod);
19200+
this.add(delegateMethod);
1919219201
}
19193-
19194-
return result;
1919519202
}
1919619203
}
1919719204

0 commit comments

Comments
 (0)