Scott Murphy Heiberg created GROOVY-12652:
---------------------------------------------

             Summary: Closure packing ignores constructors and instance 
initializer blocks: escaping closures are packed
                 Key: GROOVY-12652
                 URL: https://issues.apache.org/jira/browse/GROOVY-12652
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 7.0.0-alpha-1
            Reporter: Scott Murphy Heiberg


With closure packing enabled ({{-Dgroovy.target.closure.pack=true}} or 
{{@PackedClosures}}), a closure literal in a constructor or an instance 
initializer block bypasses the escape gate, the serialization gate and the 
per-method packing mode:
{code:groovy}
class P { P(List<Closure> s) { s << { x -> x } } }
class Q { Closure f; { f = { x -> x } } }
def s = []; new P(s)
[s[0].getClass().name, new Q().f.getClass().name]
{code}
*Actual* (dynamic, @TypeChecked and @CompileStatic): 
{{[org.codehaus.groovy.runtime.PackedClosure$Fixed1, 
org.codehaus.groovy.runtime.PackedClosure$Fixed1]}}. Under {{@PackedClosures}}, 
setting a delegate on the escaped closure then throws 
UnsupportedOperationException. {{@PackedClosures}} cannot be placed on a 
constructor ("not allowed on element CONSTRUCTOR").

*Expected:* {{[P$_closure1, Q$_closure1]}}, the same result as for a method: 
escaping closures keep their class.

Cause: {{WriterController.getMethodNode()}} is null while a constructor is 
written, so the escape walk, the serialization walk and the annotation lookup 
in ClosureWriter see no enclosing method. Instance initializer blocks are 
inlined into constructors by the Verifier, so they are affected too.



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

Reply via email to