[
https://issues.apache.org/jira/browse/GROOVY-12655?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Scott Murphy Heiberg updated GROOVY-12655:
------------------------------------------
Affects Version/s: (was: 7.0.0-alpha-1)
> 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
> Reporter: Scott Murphy Heiberg
> Priority: Major
>
> {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)