Scott Murphy Heiberg created GROOVY-12650:
---------------------------------------------

             Summary: Closure packing packs closures that escape via << or a 
setter store under @CompileStatic
                 Key: GROOVY-12650
                 URL: https://issues.apache.org/jira/browse/GROOVY-12650
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 7.0.0-alpha-1
            Reporter: Scott Murphy Heiberg


{code:groovy}
// -Dgroovy.target.closure.pack=true, or @PackedClosures on the class/method
class H { Closure value }
@groovy.transform.CompileStatic def m() {
    List<Closure> l = []
    l << { 1 }
    def h = new H()
    h.value = { 2 }
    [l[0].getClass().name, h.value.getClass().name]
}
m()
{code}

*Actual:* {{[org.codehaus.groovy.runtime.PackedClosure$FixedIt, 
org.codehaus.groovy.runtime.PackedClosure$FixedIt]}}. Both escaping closures 
are packed.

*Expected:* {{[Script1$_m_closure1, Script1$_m_closure2]}}. Both closures 
escape the method and should be declined from packing, as they are in dynamic 
Groovy and under {{@TypeChecked}}.

The packing escape check ({{ClosureWriter.collectEscapingClosures}}) walks the 
method body at class generation. Under static compilation, 
{{BinaryExpressionTransformer}} has already rewritten the {{<<}} into a 
{{leftShift}} call and the setter-backed property store into a setter call, so 
the walk no longer recognises them as escapes. Other escape shapes (subscript, 
map and field stores, named constructor arguments, stores to a property of the 
same class) are already declined under {{@CompileStatic}}.



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

Reply via email to