[ https://issues.apache.org/jira/browse/GROOVY-6809?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16859579#comment-16859579 ]
Eric Milles edited comment on GROOVY-6809 at 6/9/19 10:00 PM: -------------------------------------------------------------- The AIC examples have a different bytecode sequence in Java vs Groovy. For this Java example: {code:java} public class Runner { public static void main(String[] args) { new Runner(); } public Runner() { this(new Runnable() { @Override public void run() { System.out.println("ran"); } }); } public Runner(Runnable action) { action.run(); } } {code} The no-arg constructor only delegates to another constructor after creating a new AIC. {code} // Method descriptor #15 ()V // Stack: 3, Locals: 1 public Runner(); 0 aload_0 [this] 1 new Runner$1 [3] 4 dup 5 invokespecial Runner$1() [4] 8 invokespecial Runner(java.lang.Runnable) [5] 11 return Line numbers: [pc: 0, line: 6] [pc: 11, line: 11] {code} The groovyc version of the same looks like this: {code} // Method descriptor #15 ()V // Stack: 4, Locals: 1 public Runner(); 0 aload_0 [this] 1 new Runner$1 [17] 4 dup 5 aload_0 [this] 6 invokespecial Runner$1(Runner) [20] 9 invokespecial Runner(java.lang.Runnable) [23] 12 return Line numbers: [pc: 0, line: 13] [pc: 12, line: 18] Local variable table: [pc: 0, pc: 12] local: this index: 0 type: Runner {code} Looks like groovyc created a constructor "Runner$1(Runner)" and javac created "Runner$1()", requiring no this reference passed during construction. Update: The constructor is augmented by {{InnerClassVisitor.visitConstructorCallExpression}} to have argument "this" passed. If the inner class type had a static modifier, the addition of this would be skipped. was (Author: emilles): The AIC examples have a different bytecode sequence in Java vs Groovy. For this Java example: {code:java} public class Runner { public static void main(String[] args) { new Runner(); } public Runner() { this(new Runnable() { @Override public void run() { System.out.println("ran"); } }); } public Runner(Runnable action) { action.run(); } } {code} The no-arg constructor only delegates to another constructor after creating a new AIC. {code} // Method descriptor #15 ()V // Stack: 3, Locals: 1 public Runner(); 0 aload_0 [this] 1 new Runner$1 [3] 4 dup 5 invokespecial Runner$1() [4] 8 invokespecial Runner(java.lang.Runnable) [5] 11 return Line numbers: [pc: 0, line: 6] [pc: 11, line: 11] {code} The groovyc version of the same looks like this: {code} // Method descriptor #15 ()V // Stack: 4, Locals: 1 public Runner(); 0 aload_0 [this] 1 new Runner$1 [17] 4 dup 5 aload_0 [this] 6 invokespecial Runner$1(Runner) [20] 9 invokespecial Runner(java.lang.Runnable) [23] 12 return Line numbers: [pc: 0, line: 13] [pc: 12, line: 18] Local variable table: [pc: 0, pc: 12] local: this index: 0 type: Runner {code} Looks like groovyc created a constructor "Runner$1(Runner)" and javac created "Runner$1()", requiring no this reference passed during construction. Update: The constructor is augmented by {{InnerClassVisitor.visitConstructorCallExpression}} to have argument "this" passed. > VerifyError With Inner Class > ----------------------------- > > Key: GROOVY-6809 > URL: https://issues.apache.org/jira/browse/GROOVY-6809 > Project: Groovy > Issue Type: Bug > Components: Compiler > Affects Versions: 2.3.0, 2.4.0-beta-3 > Reporter: Jeff Brown > Priority: Major > > The following code compiles but throws a VerifyError at runtime: > {code:title=Test.groovy|borderStyle=solid} > class Test { > static void main(String[] args) { > def a = new A() > } > static class A { > A() { > def b = new B() > } > void sayA() { println 'saying A' } > class B extends A { > public B() { > super(A.this) > sayA() > } > } > } > } > {code} > I didn't go back through versions but I tested with 2.3.0 and that shows the > problem. > {noformat} > Caught: java.lang.VerifyError: (class: Test$A$B, method: <init> signature: > (LTest$A;)V) Expecting to find object/array on stack > java.lang.VerifyError: (class: Test$A$B, method: <init> signature: > (LTest$A;)V) Expecting to find object/array on stack > at Test$A.<init>(Test.groovy:9) > at Test.main(Test.groovy:4) > {noformat} -- This message was sent by Atlassian JIRA (v7.6.3#76005)