[ 
https://issues.apache.org/jira/browse/GROOVY-12655?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18137645#comment-18137645
 ] 

ASF GitHub Bot commented on GROOVY-12655:
-----------------------------------------

testlens-app[bot] commented on PR #3176:
URL: https://github.com/apache/groovy/pull/3176#issuecomment-6618105235

   ## ✅ All tests passed ✅
   
   🏷️ Commit: 0d3a2c69a7c3c64b5618797361b3f580d4338437
   ▶️ Tests:  112557 executed
   ⚪️ Checks: 26/26 completed
   
   ---
   _Learn more about TestLens at 
[testlens.app/docs](https://testlens.app/docs/features/pr-comment/)._
   




> 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)

Reply via email to