java - Operand stack underrun -
i have program generate bytecode java file. , simple test() method
public void test() { boolean = false; if (a || true) { boolean b = false; } }
, generate follow piece of bytecode
public void test() code: 7: iconst_0 8: istore_1 9: iload_1 10: ifne 13 13: iconst_0 14: istore_2 15: return
when execute class, keep getting operand stack underrun in test()
, couldn't figure out why because generated bytecode looks (to me)
could me debug this?
(here's did trace stack
public void test() code: 7: iconst_0 (1 on stack) 8: istore_1 (0 on stack) 9: iload_1 (1 on stack) 10: ifne 13 (0 on stack) 13: iconst_0 (1 on stack) 14: istore_2 (0 on stack) 15: return
so yeah, stack looks fine me!)
edit: here's generated bytecode javac
public void test(); code: 0: iconst_0 1: istore_1 2: iload_1 3: ifne 6 6: iconst_0 7: istore_2 8: return
when try this
public class maindump implements opcodes { public static byte[] dump() throws exception { classwriter cw = new classwriter(0); fieldvisitor fv; methodvisitor mv; annotationvisitor av0; cw.visit(v1_7, acc_public + acc_super, "main", null, "java/lang/object", null); cw.visitsource("main.java", null); { mv = cw.visitmethod(acc_public, "<init>", "()v", null, null); mv.visitcode(); label l0 = new label(); mv.visitlabel(l0); mv.visitlinenumber(1, l0); mv.visitvarinsn(aload, 0); mv.visitmethodinsn(invokespecial, "java/lang/object", "<init>", "()v"); mv.visitinsn(return); label l1 = new label(); mv.visitlabel(l1); mv.visitlocalvariable("this", "lmain;", null, l0, l1, 0); mv.visitmaxs(1, 1); mv.visitend(); } { mv = cw.visitmethod(acc_public, "test", "()v", null, null); mv.visitcode(); mv.visitinsn(iconst_0); mv.visitvarinsn(istore, 1); mv.visitvarinsn(iload, 1); label l2 = new label(); mv.visitjumpinsn(ifeq, l2); mv.visitinsn(iconst_0); mv.visitvarinsn(istore, 2); mv.visitlabel(l2); mv.visitframe(opcodes.f_append, 1, new object[]{opcodes.integer}, 0, null); mv.visitinsn(return); mv.visitmaxs(1, 3); mv.visitend(); } cw.visitend(); return cw.tobytearray(); } public static void main(string... ignored) throws exception { method defineclass = classloader.class.getdeclaredmethod("defineclass", byte[].class, int.class, int.class); defineclass.setaccessible(true); byte[] dump = dump(); defineclass.invoke(thread.currentthread().getcontextclassloader(), dump, 0, dump.length); new main().test(); } }
this works, if drop stack frame adjustment, error
exception in thread "main" java.lang.verifyerror: expecting stackmap frame @ branch target 8 exception details: location: main.test()v @3: ifeq reason: expected stackmap frame @ location. bytecode: 0000000: 033c 1b99 0005 033d b1
in short, java 7, stack operations not enough pass validity.
Comments
Post a Comment