Oscar N created GROOVY-11631: -------------------------------- Summary: Use native lookup switch for enums in TC/CS/POJO modes Key: GROOVY-11631 URL: https://issues.apache.org/jira/browse/GROOVY-11631 Project: Groovy Issue Type: Improvement Components: performance Affects Versions: 5.0.0-alpha-12 Reporter: Oscar N
It would be nice if the Groovy compiler could generate a native lookup switch on the ordinal() for enum types when there is no extension method registered for the enum's isCase() method and the enum itself doesn't declare one. {code:groovy} @POJO @CompileStatic enum SomeEnum { A, B } @POJO @CompileStatic final class NativeEnumSwitch { static void main(String[] args) { SomeEnum value = SomeEnum.A switch (value) { case SomeEnum.A: println "Value is A" break case SomeEnum.B: println "Value is B" break } } } {code} Currently the compiler generates an else-if chain of ScriptBytecodeAdapter.isCase() calls, even with the POJO annotation: {code:java} public static void main(String... args) { SomeEnum value = SomeEnum.A; if (ScriptBytecodeAdapter.isCase(value, SomeEnum.A)) { DefaultGroovyMethods.println(NativeEnumSwitch.class, "Value is A"); Object var10000 = null; } else if (ScriptBytecodeAdapter.isCase(value, SomeEnum.B)) { DefaultGroovyMethods.println(NativeEnumSwitch.class, "Value is B"); Object var3 = null; } } {code} {code:java} // access flags 0x89 public static varargs main([Ljava/lang/String;)V L0 LINENUMBER 14 L0 GETSTATIC SomeEnum.A : LSomeEnum; ASTORE 1 L1 LINENUMBER 15 L1 ALOAD 1 ASTORE 2 L2 LINENUMBER 16 L2 ALOAD 2 GETSTATIC SomeEnum.A : LSomeEnum; INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.isCase (Ljava/lang/Object;Ljava/lang/Object;)Z IFEQ L3 L4 LINENUMBER 17 L4 LDC LNativeEnumSwitch;.class LDC "Value is A" INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.println (Ljava/lang/Object;Ljava/lang/Object;)V ACONST_NULL POP L5 LINENUMBER 18 L5 GOTO L6 NOP NOP ATHROW L3 LINENUMBER 19 L3 ALOAD 2 GETSTATIC SomeEnum.B : LSomeEnum; INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.isCase (Ljava/lang/Object;Ljava/lang/Object;)Z IFEQ L6 L7 LINENUMBER 20 L7 LDC LNativeEnumSwitch;.class LDC "Value is B" INVOKESTATIC org/codehaus/groovy/runtime/DefaultGroovyMethods.println (Ljava/lang/Object;Ljava/lang/Object;)V ACONST_NULL POP L8 LINENUMBER 21 L8 GOTO L6 L6 LINENUMBER 23 L6 RETURN LOCALVARIABLE args [Ljava/lang/String; L0 L6 0 LOCALVARIABLE value LSomeEnum; L1 L6 1 MAXSTACK = 2 MAXLOCALS = 3 {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)