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)