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 2020/12/28 19:59:00 UTC
[jira] [Commented] (GROOVY-9873) SAM type or functional interface
referenced from a method is not visible from class loader
[ https://issues.apache.org/jira/browse/GROOVY-9873?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17255709#comment-17255709 ]
Eric Milles commented on GROOVY-9873:
-------------------------------------
This also affects earlier Groovy releases when "indy" compiler option is enabled.
> SAM type or functional interface referenced from a method is not visible from class loader
> ------------------------------------------------------------------------------------------
>
> Key: GROOVY-9873
> URL: https://issues.apache.org/jira/browse/GROOVY-9873
> Project: Groovy
> Issue Type: Bug
> Affects Versions: 2.4.21, 2.5.14, 3.0.7, 4.0.0-alpha-2
> Reporter: Eric Milles
> Priority: Major
> Labels: indy
>
> When type checked but not statically compiled, this case of method closure or whatever is failing for Groovy 4 but works for Groovy 3 and earlier. The line {{set.map(x -> x.first().intValue())}} is the source. GROOVY-9803 was the original issue; when broken up into separate source units, the class loader issue appears.
> New test case for {{groovy.transform.stc.GenericsSTCTest}}:
> {code:groovy}
> // GROOVY-9803, GROOVY-9873
> void testShouldUseMethodGenericType9() {
> // same as above but with separate source units
> config.with {
> targetDirectory = File.createTempDir()
> jointCompilationOptions = [memStub: true]
> }
> File parentDir = File.createTempDir()
> try {
> def c = new File(parentDir, 'C.groovy')
> c.write '''
> class C<T> {
> private T t
> C(T item) {
> t = item
> }
> static <U> C<U> of(U item) {
> new C<U>(item)
> }
> def <V> C<V> map(F<? super T, ? super V> func) {
> new C<V>(func.apply(t))
> }
> }
> '''
> def d = new File(parentDir, 'D.groovy')
> d.write '''
> class D {
> static <W> Set<W> wrap(W o) {
> Collections.singleton(o)
> }
> }
> '''
> def f = new File(parentDir, 'F.groovy')
> f.write '''
> interface F<X,Y> {
> Y apply(X x)
> }
> '''
> def g = new File(parentDir, 'G.groovy')
> g.write '''
> void test() {
> def c = C.of(123)
> def set = c.map(D.&wrap)
> def num = set.map(x -> x.first().intValue())
> }
> test()
> '''
> def loader = new GroovyClassLoader(this.class.classLoader)
> def cu = new JavaAwareCompilationUnit(config, loader)
> cu.addSources(c, d, f, g)
> cu.compile()
> loader.loadClass('G').main()
> } finally {
> parentDir.deleteDir()
> config.targetDirectory.deleteDir()
> }
> }
> {code}
> {code}
> java.lang.IllegalArgumentException: F referenced from a method is not visible from class loader
> at java.base/java.lang.reflect.Proxy$ProxyBuilder.ensureVisible(Proxy.java:858)
> at java.base/java.lang.reflect.Proxy$ProxyBuilder.validateProxyInterfaces(Proxy.java:681)
> at java.base/java.lang.reflect.Proxy$ProxyBuilder.<init>(Proxy.java:627)
> at java.base/java.lang.reflect.Proxy$ProxyBuilder.<init>(Proxy.java:635)
> at java.base/java.lang.reflect.Proxy.lambda$getProxyConstructor$0(Proxy.java:415)
> at java.base/jdk.internal.loader.AbstractClassLoaderValue$Memoizer.get(AbstractClassLoaderValue.java:329)
> at java.base/jdk.internal.loader.AbstractClassLoaderValue.computeIfAbsent(AbstractClassLoaderValue.java:205)
> at java.base/java.lang.reflect.Proxy.getProxyConstructor(Proxy.java:413)
> at java.base/java.lang.reflect.Proxy.newProxyInstance(Proxy.java:1006)
> at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
> at G.test(G.groovy:4)
> at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
> at G.run(G.groovy:7)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.base/java.lang.reflect.Method.invoke(Method.java:566)
> at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:112)
> at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1270)
> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1036)
> at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod(InvokerHelper.java:1031)
> at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:1014)
> at org.codehaus.groovy.runtime.InvokerHelper.runScript(InvokerHelper.java:444)
> at org.codehaus.groovy.vmplugin.v8.IndyInterface.fromCache(IndyInterface.java:318)
> at G.main(G.groovy)
> {code}
--
This message was sent by Atlassian Jira
(v8.3.4#803005)