Scott Murphy Heiberg created GROOVY-12718:
---------------------------------------------

             Summary: super.f, super.@f and this.@f of a package-private field 
of a superclass of another class loader fail with IllegalAccessError in dynamic 
code
                 Key: GROOVY-12718
                 URL: https://issues.apache.org/jira/browse/GROOVY-12718
             Project: Groovy
          Issue Type: Bug
    Affects Versions: 5.0.8, 4.0.32, 6.0.0
            Reporter: Scott Murphy Heiberg


{code:groovy}
def shell = new GroovyShell()
shell.evaluate '''package p
class F { @groovy.transform.PackageScope String pf = 'pf' }
true'''
shell.evaluate '''package p
class C extends F {
    def test() {
        assert pf == 'pf'       // works
        assert this.pf == 'pf'  // works
        super.pf                // IllegalAccessError, as are super.@pf, 
this.@pf and writes through them
    }
}
new C().test()'''
{code}
*Actual:* {{IllegalAccessError: class p.C tried to access field p.F.pf}}.

*Expected:* the value of the field, through the meta-class, as for {{pf}} and 
{{this.pf}}.

Cause: {{F}} comes from an earlier parse, so it has the same package name as 
{{C}} but another class loader, which makes it another run-time package. 
{{AsmClassGenerator.visitPropertyExpression}} and {{visitAttributeExpression}} 
decide by the package name and write {{GETFIELD}} or {{PUTFIELD}}, in dynamic 
and {{@TypeChecked}} code too.

Verified on 4.0.32, 5.0.8, 6.0.0 and master.



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

Reply via email to