- changed status to resolved
Broken bytecode when using generic container to access int array
Issue #273
resolved
ExtendJ 8.1.0-21-g42ca049 Java SE 7
ExtendJ generates unexecutable bytecode for the following program:
// Test generic container with primitive array argument.
// .result: EXEC_PASS
public class Test {
public static void main(String[] args) {
int[] values = new int[100];
for (int i = 0; i < 100; ++i) {
values[i] = (i * i * 255 + i * 6) % 100;
}
run(values);
}
static void run(int[] values) {
Container<int[]> con = new Container<int[]>(values);
if (con.get()[43] != 53 || con.get()[44] != 44) {
System.out.println("wrong values");
}
}
}
class Container<T> {
private final T value;
public Container(T value) {
this.value = value;
}
T get() {
return value;
}
}
Expected result: should be executable.
Actual result: fails to run:
[junit] [FAIL] runTest[run/generics/container_04](tests.extendj.TestJava7)
[junit] Error output files differ expected:<[]> but was:<[Exception in thread "main" java.lang.VerifyError: Bad type on operand stack in iaload
[junit] Exception Details:
[junit] Location:
[junit] Test.run([I)V @15: iaload
[junit] Reason:
[junit] Type 'java/lang/Object' (current frame, stack[0]) is not assignable to '[I'
[junit] Current Frame:
[junit] bci: @15
[junit] flags: { }
[junit] locals: { '[I', 'Container' }
[junit] stack: { 'java/lang/Object', integer }
...
Comments (1)
-
reporter - Log in to comment
Add missing array access casting conversions
This fixes problems in code generation for array accesses via generic types. It may be necessary to cast a generic type to the expected array type before generating an array access instruction.
This also fixes incorrect equations for the attribute Expr.erasedType().
fixes
#273(bitbucket)→ <<cset 4f6c910ee290>>