You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2021/10/15 18:30:00 UTC

[jira] [Commented] (GROOVY-10302) StackOverflowError on Java 16+ for override method that delegates to super

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

Eric Milles commented on GROOVY-10302:
--------------------------------------

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)