+
+ // Debugging //////////////////////////////////////////////////////////////////////////////
+
+ public void debugBodyToString(StringBuffer sb) {
+ // This is intentionally a local variable so it can be removed by gcclass
+ final String[] OP_NAMES = new String[]{
+ "nop", "aconst_null", "iconst_m1", "iconst_0", "iconst_1", "iconst_2",
+ "iconst_3", "iconst_4", "iconst_5", "lconst_0", "lconst_1", "fconst_0",
+ "fconst_1", "fconst_2", "dconst_0", "dconst_1", "bipush", "sipush",
+ "ldc", "ldc_w", "ldc2_w", "iload", "lload", "fload",
+ "dload", "aload", "iload_0", "iload_1", "iload_2", "iload_3",
+ "lload_0", "lload_1", "lload_2", "lload_3", "fload_0", "fload_1",
+ "fload_2", "fload_3", "dload_0", "dload_1", "dload_2", "dload_3",
+ "aload_0", "aload_1", "aload_2", "aload_3", "iaload", "laload",
+ "faload", "daload", "aaload", "baload", "caload", "saload",
+ "istore", "lstore", "fstore", "dstore", "astore", "istore_0",
+ "istore_1", "istore_2", "istore_3", "lstore_0", "lstore_1", "lstore_2",
+ "lstore_3", "fstore_0", "fstore_1", "fstore_2", "fstore_3", "dstore_0",
+ "dstore_1", "dstore_2", "dstore_3", "astore_0", "astore_1", "astore_2",
+ "astore_3", "iastore", "lastore", "fastore", "dastore", "aastore",
+ "bastore", "castore", "sastore", "pop", "pop2", "dup",
+ "dup_x1", "dup_x2", "dup2", "dup2_x1", "dup2_x2", "swap",
+ "iadd", "ladd", "fadd", "dadd", "isub", "lsub",
+ "fsub", "dsub", "imul", "lmul", "fmul", "dmul",
+ "idiv", "ldiv", "fdiv", "ddiv", "irem", "lrem",
+ "frem", "drem", "ineg", "lneg", "fneg", "dneg",
+ "ishl", "lshl", "ishr", "lshr", "iushr", "lushr",
+ "iand", "land", "ior", "lor", "ixor", "lxor",
+ "iinc", "i2l", "i2f", "i2d", "l2i", "l2f",
+ "l2d", "f2i", "f2l", "f2d", "d2i", "d2l",
+ "d2f", "i2b", "i2c", "i2s", "lcmp", "fcmpl",
+ "fcmpg", "dcmpl", "dcmpg", "ifeq", "ifne", "iflt",
+ "ifge", "ifgt", "ifle", "if_icmpeq", "if_icmpne", "if_icmplt",
+ "if_icmpge", "if_icmpgt", "if_icmple", "if_acmpeq", "if_acmpne", "goto",
+ "jsr", "ret", "tableswitch", "lookupswitch", "ireturn", "lreturn",
+ "freturn", "dreturn", "areturn", "return", "getstatic", "putstatic",
+ "getfield", "putfield", "invokevirtual", "invokespecial", "invokestatic", "invokeinterface",
+ "", "new", "newarray", "anewarray", "arraylength", "athrow",
+ "checkcast", "instanceof", "monitorenter", "monitorexit", "wide", "multianewarray",
+ "ifnull", "ifnonnull", "goto_w", "jsr_w", "", "",
+ "", "", "", "", "", "",
+ "", "", "", "", "", "",
+ "", "", "", "", "", "",
+ "", "", "", "", "", "",
+ "", "", "", "", "", "",
+ "", "", "", "", "", "",
+ "", "", "", "", "", "",
+ "", "", "", "", "", "",
+ "", "", "", ""
+ };
+ for(int i=0;i<size();i++) {
+ sb.append(" ");
+ for(int j=i==0?1:i;j<10000;j*=10) sb.append(" ");
+ sb.append(i).append(": ");
+ sb.append(OP_NAMES[op[i]&0xff]);
+ String s = null;
+ if (arg[i] instanceof Type) s = ((Type)arg[i]).debugToString();
+ else if (arg[i] instanceof Type.Class.Member) s = ((Type.Class.Member)arg[i]).debugToString();
+ else if (arg[i] instanceof String) s = "\"" + s + "\"";
+ else if (arg[i] != null) s = arg[i].toString();
+ if (s != null) sb.append(" ").append(s);
+ sb.append("\n");
+ }
+ }
+
+ // Unused //////////////////////////////////////////////////////////////////////////////
+
+ /** Negates the IF* instruction, <i>op</i> (IF_ICMPGT -> IF_ICMPLE, IFNE -> IFEQ, etc)
+ @exception IllegalArgumentException if <i>op</i> isn't an IF* instruction */
+ public static byte negate(byte op) {
+ switch(op) {
+ case IFEQ: return IFNE;
+ case IFNE: return IFEQ;
+ case IFLT: return IFGE;
+ case IFGE: return IFLT;
+ case IFGT: return IFLE;
+ case IFLE: return IFGT;
+ case IF_ICMPEQ: return IF_ICMPNE;
+ case IF_ICMPNE: return IF_ICMPEQ;
+ case IF_ICMPLT: return IF_ICMPGE;
+ case IF_ICMPGE: return IF_ICMPLT;
+ case IF_ICMPGT: return IF_ICMPLE;
+ case IF_ICMPLE: return IF_ICMPGT;
+ case IF_ACMPEQ: return IF_ACMPNE;
+ case IF_ACMPNE: return IF_ACMPEQ;
+
+ default:
+ throw new IllegalArgumentException("Can't negate " + Integer.toHexString(op));
+ }
+ }
+
+