Possible LVT regression with labelled block statements
Liam Miller-Cushon
cushon at google.com
Fri Nov 14 03:09:05 UTC 2014
I found a possible LVT bug in javac8 that affects labelled break
statements. It causes incorrect zero-length LVT entries to be emitted for
locals that have non-zero live ranges.
Here's a repro:
===
class Test {
int m(boolean flag) {
int myInt;
label:
{
if (flag) {
myInt = 1;
} else {
break label;
}
return myInt;
}
return -1;
}
}
===
With javac8, the code compiles to:
===
int m(boolean);
descriptor: (Z)I
flags:
Code:
stack=1, locals=3, args_size=2
0: iload_1
1: ifeq 8
4: iconst_1
5: istore_2
6: iload_2
7: ireturn
8: iconst_m1
9: ireturn
LineNumberTable:
line 6: 0
line 7: 4
line 12: 6
line 14: 8
LocalVariableTable:
Start Length Slot Name Signature
6 0 2 myInt I
0 10 0 this LTest;
0 10 1 flag Z
===
My understanding is that the zero-length LVT entry for 'myInt' is
incorrect. With earlier versions of javac (and also ecj) the entry's length
is 2.
The behaviour started occurring after the change that fixed JDK-8012868
[1][2], so this affects javac8 and 9. It reproduces with the latest version
of javac9 (I tested @c286272a81dd).
The issue was originally discovered because it affects joda time,
specifically the local variable 'expectSeparators' in
DateTimeFormatterBuilder [3].
[1] http://hg.openjdk.java.net/jdk9/dev/langtools/rev/4932bb04c4b8
[2] https://bugs.openjdk.java.net/browse/JDK-8012868
[3]
https://github.com/JodaOrg/joda-time/blob/1379098f681f0d4d6f0a3403ab6727dc3437b6df/src/main/java/org/joda/time/format/DateTimeFormatterBuilder.java#L2132
Thanks,
Liam
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20141113/465603ca/attachment-0001.html>
More information about the compiler-dev
mailing list