You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Anton Panikov (Jira)" <ji...@apache.org> on 2023/06/21 01:17:00 UTC
[jira] [Created] (GROOVY-11107) EnumSet varargs constructor is not recognized (broken) in runtime
Anton Panikov created GROOVY-11107:
--------------------------------------
Summary: 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: 4.0.12, 3.0.17, 2.5.22
Reporter: Anton Panikov
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)