FULL PRODUCT VERSION : javac 1.6.0_11 javac 1.6.0_12 ADDITIONAL OS VERSION INFORMATION : Microsoft Windows [Wersja 6.0.6001] - Microsoft Vista, Linux 32-bit A DESCRIPTION OF THE PROBLEM : Compilation of the attached test case results in a java.lang.VerifyError. This is due to a bad compilation of the class (see expected and actual results). STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : Compile the attached test case. Run the test case. Observe the error. Decompile the .class file to get the bad bytecode. EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - Expected bytecode: > javap -c test.Test Compiled from "Test.java" public class test.Test extends java.lang.Object{ public test.Test(); Code: 0: aload_0 1: invokespecial #8; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: iconst_0 1: istore_2 2: iconst_0 3: invokestatic #16; //Method java/lang/Byte.valueOf:(B)Ljava/lang/Byte; 6: astore_1 7: return } 0 is assigned to 'fi' (lines 0-1 of main()) but later a constant 0 is used for assignment to 'B' (by means of Byte.valueOf() method) as 'fi' is a compile-time constant and should be inlined. ACTUAL - Actual bytecode: > javap -c test.Test Compiled from "Test.java" public class test.Test extends java.lang.Object{ public test.Test(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public static void main(java.lang.String[]); Code: 0: iload_2 1: i2b 2: invokestatic #2; //Method java/lang/Byte.valueOf:(B)Ljava/lang/Byte; 5: astore_1 6: return } in line 0 of the main() method the code tries lo load a local integer variable #2 ('fi'). But there is no initialisation of that variable. The whole main() method is reduced to the 'B=fi;' assignment, but neither the constant 0 value is used nor is 'fi' initialised with 0 previously. ERROR MESSAGES/STACK TRACES THAT OCCUR : > java test.Test Exception in thread "main" java.lang.VerifyError: (class: test/Test, method: main signature: ([Ljava/lang/String;)V) Accessing value from uninitialized register 2 Could not find the main class: test.Test. Program will exit. REPRODUCIBILITY : This bug can be reproduced always. ---------- BEGIN SOURCE ---------- package test; public class Test { public static void main(String[] args) { Byte B; final int fi = 0; B = fi; // narrowing pri. (int -> byte) + boxing (byte -> Byte) } } ---------- END SOURCE ---------- CUSTOMER SUBMITTED WORKAROUND : Assignment in two steps solves the case. class Test { public static void main(String[] args) { final int fi = 0; byte b = fi; // int -> byte Byte B = b; // byte -> Byte } }
|