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)