ASM incorrectly merges Object[] and byte[][] in StackMapTable
ASM incorrectly merges Object[] and byte[][] in StackMapTable
Newer 1.7 JREs hit VerifyError loading classes with byte[][] in stacks after
manipulation with ASM. The StackMapTable entry for byte[][] is not correct
following manipulation - becomes Object[].
Minimal recreate attached in a.java courtesy of Brett Kail.
Reproducible with latest stable ASM 5 and 4 using
java version "1.7.0_45"
Java(TM) SE Runtime Environment (build 1.7.0_45-b18)
Java HotSpot(TM) 64-Bit Server VM (build 24.45-b08, mixed mode).
Result from running recreate:
Exception in thread "main" java.lang.VerifyError: Bad return type
Exception Details:
Location:
a.m(Z)[Ljava/lang/Object; @15: areturn
Reason:
Type 'java/lang/Object' (current frame, stack[0]) is not assignable to
'[Ljava/lang/Object;' (from method signature)
Current Frame:
bci: @15
flags: { }
locals: { integer }
stack: { 'java/lang/Object' }
Bytecode:
0000000: 1a99 000a 03bd 0004 a700 0703 bd00 48b0
0000010:
Stackmap Table:
same_frame(@11)
same_locals_1_stack_item_frame(@15,Object[#4])
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2531)
at java.lang.Class.getDeclaredMethod(Class.java:2002)
at a$1.<init>(a.java:13)
at a.main(a.java:13)