Scott Murphy Heiberg created GROOVY-12655:
---------------------------------------------

             Summary: Closure packing packs a closure stored to a script 
binding variable or dynamic property, which then rejects a delegate
                 Key: GROOVY-12655
                 URL: https://issues.apache.org/jira/browse/GROOVY-12655
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 6.0.0, 7.0.0-alpha-1
            Reporter: Scott Murphy Heiberg


{code:groovy}
@groovy.transform.PackedClosures
def install() { handler = { x -> x + 1 } }
install()
handler.delegate = 'd'
handler(1)
{code}
*Actual:* {{java.lang.UnsupportedOperationException: Cannot set a delegate on a 
@PackedClosures closure (hoisted method '$packed$closure$0') ...}}

*Expected:* the closure is not packed, because it escapes into the script 
binding, and the script returns 2 as it does without the annotation.

The same happens when a method of an annotated class stores to an undeclared 
name (a dynamic property, e.g. one taken by {{propertyMissing}}) and when a 
script method stores to an {{@Field}}. With 
{{-Dgroovy.target.closure.pack=true}}, a binding store in a script's run method 
is packed too, and so is one in {{@CompileStatic}} code whose type checking 
extension makes the variable dynamic.

Cause: the escape gate in {{ClosureWriter}} ({{isLocalTarget}}) treats any 
assignment target that is not a field or property node as a local, including a 
{{DynamicVariable}}, which is stored through the MOP where code outside the 
method can read it.

Verified on 6.0.0 and master.



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

Reply via email to