You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Damir Murat (Jira)" <ji...@apache.org> on 2021/06/29 12:21:00 UTC
[jira] [Created] (GROOVY-10156) Unreachable bytecode in switch
statement
Damir Murat created GROOVY-10156:
------------------------------------
Summary: Unreachable bytecode in switch statement
Key: GROOVY-10156
URL: https://issues.apache.org/jira/browse/GROOVY-10156
Project: Groovy
Issue Type: Improvement
Components: Compiler
Affects Versions: 3.0.8
Environment: JVM: 11.0.11 (Oracle Corporation 11.0.11+9-LTS-194)
OS: Mac OS X 10.16 x86_64
Reporter: Damir Murat
When switching over an enum, and for two or more case branches, groovy generates unreachable bytecode for each case branch except the last one.
For example
{code:java}
package mypackage
import groovy.transform.CompileStatic
@CompileStatic
class SwitchDemo {
void mySwitchMethod(MyEnum myEnum) {
switch (myEnum) {
case MyEnum.ONE:
println "ONE"
break
case MyEnum.TWO:
println "TWO"
break
case MyEnum.THREE:
println "TWO"
break
default:
println "default"
break
}
}
}
@CompileStatic
enum MyEnum {
ONE, TWO, THREE
}
{code}
generates bytecode sequences like
{code:java}
...
L8
L9
LINENUMBER 12 L9
GOTO L10
L3
L11
LINENUMBER 12 L11
ALOAD 2
GETSTATIC mypackage/MyEnum.TWO : Lmypackage/MyEnum;
INVOKESTATIC org/codehaus/groovy/runtime/ScriptBytecodeAdapter.isCase (Ljava/lang/Object;Ljava/lang/Object;)Z
IFEQ L12
L10
...
{code}
It looks like the first four lines above are not necessary. This results in
{noformat}
nop, nop, athrow
{noformat}
sequences in generated java bytecode.
It would be great if this can be cleaned up and fixed. My scenario is related to JaCoCo reports which are not accurate and a bit confusing for switch statements.
Tnx
--
This message was sent by Atlassian Jira
(v8.3.4#803005)