Scott Murphy Heiberg created GROOVY-12575:
---------------------------------------------

             Summary: A trait's instance initializer blocks run twice under 
joint compilation
                 Key: GROOVY-12575
                 URL: https://issues.apache.org/jira/browse/GROOVY-12575
             Project: Groovy
          Issue Type: Bug
          Components: Compiler, Stub generator / Joint compiler
    Affects Versions: 5.0.8, 4.0.33, 6.0.0
            Reporter: Scott Murphy Heiberg


When Groovy and Java sources are compiled together, each instance initializer 
block of a trait runs twice per instance:

{code:groovy}
trait T { List<String> log = []; { log << 'block' } }
class C implements T {}
{code}

{code:java}
public class J { public static void main(String[] a) { System.out.println(new 
C().getLog()); } }
{code}

{{groovyc -j T.groovy J.java}}, then {{java J}}, prints {{[block, block]}}; 
compiled without {{-j}}, {{new C().log}} is {{[block]}}. Dynamic and 
{{@CompileStatic}} implementing classes behave alike.

The stub generator runs a {{Verifier}} over each class. {{Verifier.visitClass}} 
clears the object initializer statements of a class after copying them into its 
constructors, so {{JavaStubGenerator}} saves them first and adds them back 
afterwards. For an interface or a trait, {{visitClass}} returns before that 
point and keeps them, so adding them back doubles them, and the trait 
transformation copies every block into the helper's {{$init$}} twice. Field 
initializers and static initializer blocks of traits are not affected.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to