- changed status to resolved
Incorrect Stack Map Frame
Issue #243
resolved
ExtendJ 8.0.1-240-g3d86145 Java SE 8
ExtendJ computes incorrect stack map frames for this test:
// Test an error in stack map frame computation caused by
// wide types not being handled correctly.
public class Test {
public static void main(String[] args) {
{
int i = 32394;
int[] ia = { 1, 2 };
int[] ia2 = { 1, 2 };
if (i != 32394) return;
System.out.print("1");
}
{
long[] la = { 1l, 2l };
long l = 6864468644l;
if (l != 6864468644l) return;
System.out.print("2");
}
{
float f = .9f;
float[] fa = { Float.NaN, Float.NaN };
if (f != .9f) return;
System.out.print("3");
}
}
}
Expected result: should print "123"
Actual result: fails to run with the following error:
[junit] [FAIL] runTest[codegen/smf_01p](tests.extendj.TestJava7)
[junit] Error output files differ expected:<[]> but was:<[Error: A JNI error has occurred, please check your installation and try again
[junit] Exception in thread "main" java.lang.VerifyError: Inconsistent stackmap frames at branch target 104
[junit] Exception Details:
[junit] Location:
[junit] Test.main([Ljava/lang/String;)V @104: getstatic
[junit] Reason:
[junit] Type top (current frame, locals[3]) is not assignable to '[I' (stack map, locals[3])
[junit] Current Frame:
[junit] bci: @100
[junit] flags: { }
[junit] locals: { '[Ljava/lang/String;', float, '[F', top }
[junit] stack: { integer }
[junit] Stackmap Frame:
[junit] bci: @104
[junit] flags: { }
[junit] locals: { '[Ljava/lang/String;', float, '[F', '[I' }
[junit] stack: { }
Comments (1)
-
reporter - Log in to comment
Fix error in stackmap frame building
Wide types were not handled correctly when updating local variable slots. There should always be a TOP entry after a wide type in the local variable map.
fixes
#243(bitbucket)→ <<cset 39743d8156d0>>