You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Alexander Kriegisch (Jira)" <ji...@apache.org> on 2023/02/05 08:33:00 UTC

[jira] [Comment Edited] (GROOVY-10450) Cannot call BiPredicate methods on closures or lambdas on JRE 16+

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

Alexander Kriegisch edited comment on GROOVY-10450 at 2/5/23 8:32 AM:
----------------------------------------------------------------------

Thanks for your insights, [~emilles]. Static compilation is not what users want in Spock and Geb. Given the earlier statement from 9 months ago, the changes are known, but the bug is 1+ year old and nothing has happened. I do not quite understand how you are planning to proceed with this, because my corresponding question was ignored. If the plan was to wait until everyone has migrated to Groovy 4 anyway and 3 is so legacy that nobody uses it anymore, why not just close the bug instead of letting it rot, playing for time? When I opened it, Groovy 4 was not out yet and neither Spock nor Geb supported it. Now they do, but still many users are on Groovy 2.5 or 3.0 for one reason or another. If you just say, "it ain't gonna happen", why is this ticket still open? Saying nothing about whether it will be backported or not, but still leaving it open, is just not very helpful.


was (Author: kriegaex):
Thanks for your insights, [~emilles]. Static compilation is not what users want in Spock and Geb. Given the earlier statement from 9 months ago, the changes are known, but the bug is 1+ year old and nothing has happened. I do not quite understand how you are planning to proceed with this, because my corresponding question was ignored. If the plan was to wait until everyone has migrated to Groovy 4 anyway and 3 is so legacy thsat nobody uses it anymore, why not just close the bug instead of letting it rot, playing for time? When I opened it, Groovy 4 was not out yet and neither Spock nor Geb supported it. Now they do, but still many users are on Groovy 2.5 or 3.0 for one reason or another. If you just say, "it ain't gonna happen", why is this ticket still open? But saying nothing about whether it will be backported or not, but still leaving it open, is just not very nice.

> Cannot call BiPredicate methods on closures or lambdas on JRE 16+
> -----------------------------------------------------------------
>
>                 Key: GROOVY-10450
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10450
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 3.0.9
>            Reporter: Alexander Kriegisch
>            Priority: Major
>
> The issue was first discovered by a Spock user in [Spock-1412|https://github.com/spockframework/spock/issues/1412].
> Under Groovy 3.0.9, the following code works on JREs 8-15, but starts failing on 16+, possibly due to [JEP 396 (Strongly Encapsulate JDK Internals by Default)|https://openjdk.java.net/jeps/396]:
> {code:groovy}
> import java.util.function.BiPredicate
> class CombineBiPredicatesAndClosures {
>   static void main(String[] args) {
>     println "Java version: ${System.properties['java.version']}"
>     // Old-school anonymous class instead of closure or lambda
>     /*
>     BiPredicate<String, Integer> bi = new BiPredicate<String, Integer>() {
>       @Override
>       boolean test(String domain, Integer score) {
>         return domain.equalsIgnoreCase("google.com")
>       }
>     }
>     */
>     // Lambda syntax only works in Groovy 3+
>     //BiPredicate<String, Integer> bi = (domain, score) -> domain.equalsIgnoreCase("google.com")
>     //def bi2 = (domain, score) -> score == 11
>     // Closure syntax works in Groovy 2.5, too
>     BiPredicate<String, Integer> bi = { domain, score -> domain.equalsIgnoreCase("google.com") }
>     def bi2 = { domain, score -> score == 11 }
>     def logicalNot = bi.negate()
>     assert logicalNot.test("acme.org", 11)
>     assert !logicalNot.test("google.com", 11)
>     def logicalOr = bi | bi2
>     assert logicalOr.test("google.com", 11)
>     assert logicalOr.test("google.com", 0)
>     assert logicalOr.test("x", 11)
>     assert !logicalOr.test("x", 0)
>     def logicalAnd = bi & bi2
>     assert logicalAnd.test("google.com", 11)
>     assert !logicalAnd.test("google.com", 0)
>     assert !logicalAnd.test("x", 11)
>     assert !logicalAnd.test("x", 0)
>   }
> }
> {code}
> Running the program yields something like:
> {code:none}
> Java version: 16
> Exception in thread "main" java.lang.reflect.InvocationTargetException
> 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78)
> 	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.vmplugin.v9.Java9.of(Java9.java:160)
> 	at org.codehaus.groovy.vmplugin.v9.Java9.getInvokeSpecialHandle(Java9.java:179)
> 	at org.codehaus.groovy.runtime.ConversionHandler.lambda$invoke$0(ConversionHandler.java:97)
> 	at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)
> 	at org.codehaus.groovy.runtime.ConversionHandler.invoke(ConversionHandler.java:97)
> 	at jdk.proxy1/jdk.proxy1.$Proxy9.negate(Unknown Source)
> 	at java_util_function_BiPredicate$negate.call(Unknown Source)
> 	at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
> 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
> 	at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:130)
> 	at CombineBiPredicatesAndClosures.main(CombineBiPredicatesAndClosures.groovy:25)
> Caused by: java.lang.IllegalAccessException: module jdk.proxy1 does not open jdk.proxy1 to unnamed module @153f5a29
> 	at java.base/java.lang.invoke.MethodHandles.privateLookupIn(MethodHandles.java:260)
> 	... 15 more
> {code}
> When running the same program on Groovy 4.0.0-rc-2, there are no problems on JDK 16+. Using the commented-out anonymous class instead of either a lambda or closure also works around the problem on Groovy 3.
> Could you please fix this for the next 3.0.x version? Thank you.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)