Broken bytecode for nested try statements
Issue #242
resolved
ExtendJ 8.0.1-240-g3d86145 Java SE 8
Broken bytecode is generated for this test:
// Test try-statement control flow. public class Test { public static void main(String[] args) throws Exception { System.out.println(new Test().run()); } public int run() throws Exception { int result = -1; try { try { return result; } finally { result = 0; } } catch(Exception ex) { return result; } } }
Expected result: should print "-1"
Actual result: fails to run:
[junit] [FAIL] runTest[run/try_06](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: Expecting a stackmap frame at branch target 15 [junit] Exception Details: [junit] Location: [junit] Test.run()I @2: iload_2 [junit] Reason: [junit] Expected stackmap frame at this location. [junit] Bytecode: [junit] 0x0000000: 023d 1c3c 033d 1bac 4e03 3d2d bf00 004e [junit] 0x0000010: 1cac [junit] Exception Handler Table: [junit] bci [2, 8] => handler: 8 [junit] bci [2, 15] => handler: 15 [junit] Stackmap Table: [junit] full_frame(@8,{Object[#2],Top,Integer},{Object[#44]}) [junit] same_locals_1_stack_item_frame(@13,Object[#37])
Comments (2)
-
reporter -
reporter - changed status to resolved
Update exception handler after deleting block
This improves the handling of exception ranges after deleting basic blocks. The handler label is now updated when merging a block with a previous deleted block. Also improved trimming ranges after deleting a block.
fixes
#242(bitbucket)→ <<cset 58987e28ef71>>
- Log in to comment
This error occurs because an exception entry jumps to a block that will be expanded. The exception handler position should be changed to the new start position for the basic block.