@@ -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