Created
July 19, 2013 05:20
-
-
Save marchof/6036631 to your computer and use it in GitHub Desktop.
Missing LineNumberTable entries with JDK8?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Hi, | |
I'm currently working on a Java 8 version of the code coverage tool JaCoCo. This tool relies on line number information within class files. Some of our integration tests fail with JDK8, probably due to incomplete line number information. | |
STEPS TO REPRODUCE | |
Compile the source file attached with the lates JDK8 build (1.8.0-ea-b97). | |
EXPECTED | |
The compiled class files has a LineNumberTable entry for the method invocation b() in line 10. | |
ACTUAL | |
There is no separate LineNumberTable entry for the invocation of b(). So b() appears to be invoked in line 8 instead of 10. See javap output below. | |
The problem seems to be specific to static methods. Line numbers are reported correctly if method b() is an instance method. | |
Best regards, | |
-marc | |
static void m(boolean); | |
descriptor: (Z)V | |
flags: ACC_STATIC | |
Code: | |
stack=1, locals=1, args_size=1 | |
0: iload_0 | |
1: ifeq 10 | |
4: invokestatic #2 // Method a:()V | |
7: goto 13 | |
10: invokestatic #3 // Method b:()V | |
13: return | |
LineNumberTable: | |
line 7: 0 | |
line 8: 4 | |
line 12: 13 | |
StackMapTable: number_of_entries = 2 | |
frame_type = 10 /* same */ | |
frame_type = 2 /* same */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Reproducer for Java 8 compiler issue where wrong line numbers are reported.. | |
*/ | |
public class Target01 { | |
static void m(boolean flag) { | |
if (flag) { | |
a(); | |
} else { | |
b(); // Wrong line number for this invocation (8 instead of 10) | |
} | |
} | |
static void a() { | |
} | |
static void b() { | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment