summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala13
-rw-r--r--test/files/run/t6102.check1
-rw-r--r--test/files/run/t6102.flags1
-rw-r--r--test/files/run/t6102.scala13
4 files changed, 28 insertions, 0 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
index a804cc92d3..7627edb79d 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
@@ -2565,6 +2565,19 @@ abstract class GenASM extends SubComponent with BytecodeWriters {
case JUMP(whereto) =>
if (nextBlock != whereto) {
jcode goTo labels(whereto)
+ } else if(m.exh.exists(eh => eh.covers(b))) {
+ // SI-6102: Determine whether eliding this JUMP results in an empty range being covered by some EH.
+ // If so, emit a NOP in place of the elided JUMP, to avoid "java.lang.ClassFormatError: Illegal exception table range"
+ val isSthgLeft = b.toList.exists {
+ case _: LOAD_EXCEPTION => false
+ case _: SCOPE_ENTER => false
+ case _: SCOPE_EXIT => false
+ case _: JUMP => false
+ case _ => true
+ }
+ if(!isSthgLeft) {
+ emit(asm.Opcodes.NOP)
+ }
}
case CJUMP(success, failure, cond, kind) =>
diff --git a/test/files/run/t6102.check b/test/files/run/t6102.check
new file mode 100644
index 0000000000..b6fc4c620b
--- /dev/null
+++ b/test/files/run/t6102.check
@@ -0,0 +1 @@
+hello \ No newline at end of file
diff --git a/test/files/run/t6102.flags b/test/files/run/t6102.flags
new file mode 100644
index 0000000000..e35535c8ea
--- /dev/null
+++ b/test/files/run/t6102.flags
@@ -0,0 +1 @@
+ -Ydead-code
diff --git a/test/files/run/t6102.scala b/test/files/run/t6102.scala
new file mode 100644
index 0000000000..53584055bb
--- /dev/null
+++ b/test/files/run/t6102.scala
@@ -0,0 +1,13 @@
+// SI-6102 Wrong bytecode in lazyval + no-op finally clause
+
+object Test {
+
+ def main(args: Array[String]) {
+ try {
+ val x = 3
+ } finally {
+ print("hello")
+ }
+ }
+}
+