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

Eric Milles edited comment on GROOVY-10302 at 10/15/21, 6:30 PM:
-----------------------------------------------------------------

After much investigation I have determined that the compiler is creating MOP 
method "super$4$findClass(String)" to assist "super.findClass(name)".  However 
at run-time, Java 16 does not see "protected 
java.net.URLClassLoader#findClass(java.lang.String)" as accessible to 
CachedClass.

I'm not sure what changed between Java 15 and Java 16 that has unnamed modules 
unable to access public classes in exported packages.  That is, the "is open" 
check in Java9#checkAccessible behaves differently in pre-16 and 16+.

I experimented with opening up access but this led to a lot of problems in 
swing builder and other components that receive private references and then try 
to call overridden methods.

GROOVY-4922 is one reference in this part of the code 
(MetaClassImpl#replaceWithMOPCalls) where the MOP name cannot be directly 
resolved in all cases.  Is it reasonable to expect that a public class that is 
in an exported package should have its non-private methods indexed?  Or is some 
kind of workaround similar to 4922 in order?

[~paulk] [~daniel_sun] [~blackdrag]


was (Author: emilles):
After much investigation I have determined that the compiler is creating MOP 
method "super$4$findClass(String)" to assist "super.findClass(name)".  However 
at run-time, Java 16 does not see "protected 
java.net.URLClassLoader#findClass(java.lang.String)" as accessible to 
CachedClass.

I'm not sure what changed between Java 15 and Java 16 that has unnamed modules 
unable to access public classes in exported packages.  That is, the "is open" 
check in Java9#checkAccessible behaves differently in pre-16 and 16+.

I experimented with opening up access but this led to a lot of problems in 
swing builder and other components that receive private references and then try 
to call overridden methods.

GROOVY-4922 is one reference in this part of the code 
(MetaClassImpl#replaceWithMOPCalls) where the MOP name cannot be directly 
resolved in all cases.  Is it reasonable to expect that a public class that is 
in an exported package should have its non-private methods indexed?  Or is some 
kind of workaround similar to 4922 in order?

> StackOverflowError on Java 16+ for override method that delegates to super
> --------------------------------------------------------------------------
>
>                 Key: GROOVY-10302
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10302
>             Project: Groovy
>          Issue Type: Bug
>          Components: jdk conflict
>    Affects Versions: 4.0.0-beta-1
>            Reporter: Eric Milles
>            Priority: Major
>
> Consider the following:
> {code:groovy}
> void test() {
>     def list = []
>     def loader = new GroovyClassLoader() {
>         @Override
>         protected Class<?> findClass(String name) throws 
> ClassNotFoundException {
>             list.add(name); super.findClass(name)
>         }
>     }
>     Class result = loader.findClass('foo.bar.Baz')
> }
> {code}
> When executed on Java 16+ it produces a StackOverflowError when resolving 
> "super.findClass(name)".
> {code}
>     java.lang.StackOverflowError
>         at 
> org.codehaus.groovy.runtime.memoize.LRUCache.getAndPut(LRUCache.java:63)
>         at 
> org.codehaus.groovy.vmplugin.v8.CacheableCallSite.getAndPut(CacheableCallSite.java:48)
>         at 
> org.codehaus.groovy.vmplugin.v8.IndyInterface.lambda$fromCache$2(IndyInterface.java:298)
>         at 
> org.codehaus.groovy.vmplugin.v8.IndyInterface.doWithCallSite(IndyInterface.java:367)
>         at 
> org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:295)
>         at TestScript0$1.findClass(TestScript0.groovy:8)
>         at 
> java.base/jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
>         at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.base/java.lang.reflect.Method.invoke(Method.java:567)
>         at 
> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:116)
>         at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
>         at groovy.lang.MetaClassImpl.doInvokeMethod(MetaClassImpl.java:1424)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1140)
>         at 
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:146)
>         at TestScript0$1.findClass(TestScript0.groovy:8)
>         at 
> java.base/jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
>         at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.base/java.lang.reflect.Method.invoke(Method.java:567)
>         at 
> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:116)
>         at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
>         at groovy.lang.MetaClassImpl.doInvokeMethod(MetaClassImpl.java:1424)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1140)
>         at 
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:146)
>         at TestScript0$1.findClass(TestScript0.groovy:8)
>         at 
> java.base/jdk.internal.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
>         at 
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>         at java.base/java.lang.reflect.Method.invoke(Method.java:567)
>         at 
> org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:116)
>         at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
>         at groovy.lang.MetaClassImpl.doInvokeMethod(MetaClassImpl.java:1424)
>         at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1140)
>         at 
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:146)
>         at TestScript0$1.findClass(TestScript0.groovy:8)
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to