The bytecode instructions OPCODE_GETFIELD
and OPCODE_GETSTATIC
push wrong type (L - Object Reference) onto the stack.
Test method:
int a; public void a(){ a = 1; System.out.println(a); }
Corresponding bytecode:
public void a() { 0 aload_0; /* this */ 1 iconst_1; 2 putfield 28; /* .a */ 5 getstatic 30; /* java.lang.System.out */ 8 aload_0; /* this */ 9 getfield 28; /* .a */ 12 invokevirtual 36; /* void println(int arg0) */ 15 return; }
Type based analysis: a()V Offset Bytecode Stack before Stack after ---------------------------------------------------------------------------- 0 aload_0 <empty> L 1 iconst_1 L L, I 2 putfield L, I <empty> 5 getstatic <empty> L 8 aload_0 L L, L 9 getfield L, L L, L <-ERROR 12 invokevirtual L, I <empty> 15 return <empty> <empty> ---------------------------------------------------------------------------- Type based analysis successfully passed. </empty></empty></empty></empty></empty></empty>
The type should be resolved by using the constant pool descriptor.
fixed in revision 190