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

Eric Milles edited comment on GROOVY-11107 at 6/21/23 4:51 PM:
---------------------------------------------------------------

Groovy 4 uses a different method index strategy (see GROOVY-8164).  It does not 
match any of the "Set.of" methods.

Moving this back to Groovy 3 would break any code that references a static 
interface method indirectly.  For example "LinkedList.of(42)" or "class C 
implements List \{ def list = of(42) \}"


was (Author: emilles):
Groovy 4 uses a different method index strategy (see GROOVY-8164).  It does not 
match any of the "Set.of" methods.

Moving this back to Groovy 3 would break any code that references an interface 
method indirectly.  For example "LinkedList.of(42)" or "class C implements List 
\{ def list = of(42) \}"

> EnumSet varargs constructor is not recognized (broken) in runtime
> -----------------------------------------------------------------
>
>                 Key: GROOVY-11107
>                 URL: https://issues.apache.org/jira/browse/GROOVY-11107
>             Project: Groovy
>          Issue Type: Bug
>    Affects Versions: 2.5.22, 3.0.17
>            Reporter: Anton Panikov
>            Assignee: Eric Milles
>            Priority: Major
>             Fix For: 3.0.18
>
>
> EnumSet.of() has 6 overloaded variants, the one with varargs is throwing 
> GroovyRuntimeException, claiming it can not find a proper constructor. But it 
> is working for jdk 8 with any Groovy version: 2.4, 2.5, 3.0 and 4.0, broken 
> for jdk 11 and 17 with 2.5 and 3.0 and working fine for groovy 4.0 with any 
> jdk.
> It is a runtime exception and the code needs to access the field:
>  
> {code:java}
> package test
> enum Test1 {
>     ONE,
>     TWO,
>     THREE,
>     FOUR,
>     FIVE,
>     SIX
>     
>     public static EnumSet<Test1> test1 = EnumSet.of(ONE, TWO, THREE, FOUR, 
> FIVE, SIX)
>     //public static EnumSet<Test1> test2 = EnumSet.of(ONE, TWO, THREE, FOUR) 
> + EnumSet.of(FIVE, SIX) // workaround to not use varargs, works for any 
> combinations
> }
> class Application {
>     static void main(String[] args) {
>         Test1.test1
>    }
> }
> {code}
> It was working fine in groovy 2.4 and all groovy version using jdk 8. But in 
> groovy 2.5 and 3.0, using JDK 11 and 17 it is throwing an exception:
> {code:java}
> Exception in thread "main" java.lang.ExceptionInInitializerError
>     at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native 
> Method)
>     at 
> java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1042)
>     at 
> java.base/jdk.internal.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:43)
>     at 
> java.base/jdk.internal.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:186)
>     at java.base/java.lang.reflect.Field.acquireFieldAccessor(Field.java:1105)
>     at java.base/java.lang.reflect.Field.getFieldAccessor(Field.java:1086)
>     at java.base/java.lang.reflect.Field.get(Field.java:418)
>     at 
> org.codehaus.groovy.reflection.CachedField.getProperty(CachedField.java:70)
>     at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:1890)
>     at groovy.lang.MetaClassImpl.getProperty(MetaClassImpl.java:3827)
>     at 
> org.codehaus.groovy.runtime.callsite.ClassMetaClassGetPropertySite.getProperty(ClassMetaClassGetPropertySite.java:50)
>     at 
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:329)
>     at test.Application.main(Application.groovy:20)
> Caused by: org.codehaus.groovy.runtime.typehandling.GroovyCastException: 
> Cannot cast object '[FOUR, ONE, TWO, SIX, FIVE, THREE]' with class 
> 'java.util.ImmutableCollections$SetN' to class 'java.util.EnumSet' due to: 
> groovy.lang.GroovyRuntimeException: Could not find matching constructor for: 
> java.util.EnumSet(test.Test1, test.Test1, test.Test1, test.Test1, test.Test1, 
> test.Test1)
>     at 
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:402)
>     at 
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnNumber(DefaultTypeTransformation.java:315)
>     at 
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnCollection(DefaultTypeTransformation.java:273)
>     at 
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.castToType(DefaultTypeTransformation.java:230)
>     at 
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.castToType(ScriptBytecodeAdapter.java:615)
>     at test.Test1.<clinit>(Application.groovy:14)
>     ... 13 more
>     Suppressed: groovy.lang.GroovyRuntimeException: Could not find matching 
> constructor for: java.util.EnumSet(SetN)
>         at 
> groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1835)
>         at 
> groovy.lang.MetaClassImpl.invokeConstructor(MetaClassImpl.java:1605)
>         at 
> org.codehaus.groovy.runtime.InvokerHelper.invokeConstructorOf(InvokerHelper.java:1067)
>         at 
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.continueCastOnSAM(DefaultTypeTransformation.java:378)
>         ... 18 more{code}
> Although it is working fine in groovy 4 in all JDK: 8, 11 and 17.
>  
> ||Groovy\JDK||JDK8||jdk-11.0.19+7||jdk-17.0.7+7||
> |2.4.21|{color:#00875a}V{color}|N/A|N/A|
> |2.5.22|{color:#00875a}V{color}|{color:#de350b}X{color}|{color:#de350b}X{color}|
> |3.0.17|{color:#00875a}V{color}|{color:#de350b}X{color}|{color:#de350b}X{color}|
> |4.0.12|{color:#00875a}V{color}|{color:#00875a}V{color}|{color:#00875a}V{color}|
> Also, static compilation of enum is also fixing the problem. I am using 
> CentOS 7 and AdoptNet(Temurin) Java, see versions of groovy and java in the 
> table above.
>  



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

Reply via email to