Bug with Current KJC Compiler
Brent Fulgham
kaffe@rufus.w3.org
Tue, 2 Apr 2002 10:40:14 -0800
The version of KJC that ships in Kaffe right now has a bug with the ++ operator when used with instance variables. Here's a sample program that highlights the problem (at least under a Cygwin build):
public class PlusPlusTest
{
private int count = 0;
public PlusPlusTest() {
for (int i = 1; i < 5; ++i) {
//count++; // This works
++count; // This fails
}
}
public static void main(String[] argv) {
PlusPlusTest ppt = new PlusPlusTest();
System.out.println("Test Key: " + new Integer(ppt.count).toString());
}
}
An attempt to compile results in:
>>>>>>>>-1 / -2
10: N/A putfield
0: 1 aload_0
1: 0 invokespecial
2: 1 aload_0
3: 0 invokespecial
4: 1 iconst_1
5: 0 istore_1
6: 0 goto
7: 1 aload_0
8: 2 iconst_1
9: 1 iadd
10: N/A putfield
11: N/A iinc
12: 1 iload_1
13: 2 iconst_5
14: 0 if_icmplt
15: N/A return
0: 1 aload_0
1: 0 invokespecial
2: 1 aload_0
3: 0 invokespecial
4: 1 iconst_1
5: 0 istore_1
6: 0 goto
7: 1 aload_0
8: 2 iconst_1
9: 1 iadd
10: N/A putfield
11: N/A iinc
12: 1 iload_1
13: 2 iconst_5
14: 0 if_icmplt
15: N/A return
0: 1 aload_0
1: 0 invokespecial
2: 1 aload_0
3: 0 invokespecial
4: 1 iconst_1
5: 0 istore_1
6: 0 goto
7: 1 aload_0
8: 2 iconst_1
9: 1 iadd
10: N/A putfield
11: N/A iinc
12: 1 iload_1
13: 2 iconst_5
14: 0 if_icmplt
15: N/A return
GenCode failure in source class: PlusPlusTest
at.dms.classfile.ClassFileFormatException: stack underflow
at at.dms.classfile.InstructionHandle.checkInstruction(InstructionHandle.java:122)
at at.dms.classfile.CodeEnv.checkExecutionPath(CodeEnv.java:95)
at at.dms.classfile.JumpInstruction.check(JumpInstruction.java:147)
at at.dms.classfile.InstructionHandle.checkInstruction(InstructionHandle.java:133)
at at.dms.classfile.CodeEnv.checkExecutionPath(CodeEnv.java:95)
at at.dms.classfile.JumpInstruction.check(JumpInstruction.java:147)
at at.dms.classfile.InstructionHandle.checkInstruction(InstructionHandle.java:133)
at at.dms.classfile.CodeEnv.checkExecutionPath(CodeEnv.java:95)
at at.dms.classfile.CodeEnv.checkExecutionPaths(CodeEnv.java:73)
at at.dms.classfile.CodeEnv.check(CodeEnv.java:47)
at at.dms.classfile.CodeInfo.resolveConstants(CodeInfo.java:289)
at at.dms.classfile.AttributeList.resolveConstants(AttributeList.java:237)
at at.dms.classfile.MethodInfo.resolveConstants(MethodInfo.java:221)
at at.dms.classfile.ClassInfo.resolveConstants(ClassInfo.java:467)
at at.dms.classfile.ClassInfo.write(ClassInfo.java:360)
at at.dms.classfile.ClassInfo.write(ClassInfo.java:436)
at at.dms.kjc.CSourceClass.genCode(CSourceClass.java:235)
at at.dms.kjc.Main.genCode(Main.java:222)
at at.dms.kjc.Main.run(Main.java:174)
at at.dms.kjc.Main.compile(Main.java:68)
at at.dms.kjc.Main.main(Main.java:59)
error:stack underflow
This happens under both Kaffe and the Sun JVM, so seems to indicate a bug in the actual KJC compiler code.
Under the new KJC (from their website), it works a bit better:
Administrator@BFULGHAM1 ~/java
$ javac PlusPlusTest.java
assertion "!INTS_DISABLED()" failed: file "exception.c", line 386
Aborted (core dumped)
I'm not sure which is worse -- however the second case indicates an issue with the JVM so might be of more interest to us as time passes.
Thanks,
-Brent