Scott Murphy Heiberg created GROOVY-12684:
---------------------------------------------

             Summary: Attribute access on a closure reads and writes the 
private implementation fields of Closure
                 Key: GROOVY-12684
                 URL: https://issues.apache.org/jira/browse/GROOVY-12684
             Project: Groovy
          Issue Type: Improvement
    Affects Versions: 6.0.0
            Reporter: Scott Murphy Heiberg


Attribute access ({{.@}}) on a closure reaches the private implementation 
fields of {{groovy.lang.Closure}}, although the closure is an instance of a 
generated subclass and attribute access does not reach a superclass's private 
fields for any other class:

{code:groovy}
def c = { -> 1 }
c.@thisType = String      // overwrites Closure's private field
assert c.@thisType == String
c.@bcw                    // reads Closure's private BooleanClosureWrapper cache

class A { private int x = 1 }
class B extends A {}
new B().@x                // MissingFieldException
{code}

{{c.@delegate}}, {{c.@owner}}, {{c.@thisObject}}, {{c.@resolveStrategy}} and 
{{c.@maximumNumberOfParameters}} reach private fields of {{Closure}} the same 
way, and existing code relies on them (for example to read the owner without 
going through {{getOwner()}}). So the choice is between leaving attribute 
access as it is, and declining the fields that are implementation details 
({{thisType}}, {{bcw}}, {{serialVersionUID}} and any later caches) while 
keeping the ones code uses today.

GROOVY-12680 (apache/groovy#3201) stops {{ClosureMetaClass}} from exposing the 
private fields of {{Closure}} as properties ({{c.thisType}}, {{c.bcw}}); it 
leaves attribute access unchanged. Seen on 6.0.0 and master. In 4.0.33 the 
{{thisType}} field does not exist.



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

Reply via email to