List of usage examples for org.objectweb.asm Opcodes POP
int POP
To view the source code for org.objectweb.asm Opcodes POP.
Click Source Link
From source file:com.codename1.tools.translator.bytecodes.BasicInstruction.java
License:Open Source License
@Override public void appendInstruction(StringBuilder b, List<Instruction> instructions) { switch (opcode) { case Opcodes.NOP: break;//w w w. ja va 2 s . c o m case Opcodes.ACONST_NULL: b.append(" PUSH_POINTER(JAVA_NULL); /* ACONST_NULL */\n"); break; case Opcodes.ICONST_M1: b.append(" PUSH_INT(-1); /* ICONST_M1 */\n"); break; case Opcodes.ICONST_0: b.append(" PUSH_INT(0); /* ICONST_0 */\n"); break; case Opcodes.ICONST_1: b.append(" PUSH_INT(1); /* ICONST_1 */\n"); break; case Opcodes.ICONST_2: b.append(" PUSH_INT(2); /* ICONST_2 */\n"); break; case Opcodes.ICONST_3: b.append(" PUSH_INT(3); /* ICONST_3 */\n"); break; case Opcodes.ICONST_4: b.append(" PUSH_INT(4); /* ICONST_4 */\n"); break; case Opcodes.ICONST_5: b.append(" PUSH_INT(5); /* ICONST_5 */\n"); break; case Opcodes.LCONST_0: b.append(" PUSH_LONG(0); /* LCONST_0 */\n"); break; case Opcodes.LCONST_1: b.append(" PUSH_LONG(1); /* LCONST_1 */\n"); break; case Opcodes.FCONST_0: b.append(" PUSH_FLOAT(0); /* FCONST_0 */\n"); break; case Opcodes.FCONST_1: b.append(" PUSH_FLOAT(1); /* FCONST_1 */\n"); break; case Opcodes.FCONST_2: b.append(" PUSH_FLOAT(2); /* FCONST_2 */\n"); break; case Opcodes.DCONST_0: b.append(" PUSH_DOUBLE(0); /* DCONST_0 */\n"); break; case Opcodes.DCONST_1: b.append(" PUSH_DOUBLE(1); /* DCONST_1 */\n"); break; case Opcodes.BALOAD: b.append(" { CHECK_ARRAY_ACCESS(2, SP[-1].data.i); /* BALOAD */ \n" + " SP--; SP[-1].type = CN1_TYPE_INT; \n" + " SP[-1].data.i = ((JAVA_ARRAY_BYTE*) (*(JAVA_ARRAY)SP[-1].data.o).data)[(*SP).data.i]; \n" + " }\n"); break; case Opcodes.CALOAD: b.append(" CHECK_ARRAY_ACCESS(2, SP[-1].data.i); /* CALOAD */\n" + " SP--; SP[-1].type = CN1_TYPE_INT; \n" + " SP[-1].data.i = ((JAVA_ARRAY_CHAR*) (*(JAVA_ARRAY)SP[-1].data.o).data)[(*SP).data.i];\n"); break; case Opcodes.IALOAD: b.append(" CHECK_ARRAY_ACCESS(2, SP[-1].data.i); /* IALOAD */\n" + " SP--; SP[-1].type = CN1_TYPE_INT; \n" + " SP[-1].data.i = ((JAVA_ARRAY_INT*) (*(JAVA_ARRAY)SP[-1].data.o).data)[(*SP).data.i];\n"); break; case Opcodes.SALOAD: b.append(" CHECK_ARRAY_ACCESS(2, SP[-1].data.i); \n" + " SP--; SP[-1].type = CN1_TYPE_INT; \n" + " SP[-1].data.i = ((JAVA_ARRAY_SHORT*) (*(JAVA_ARRAY)SP[-1].data.o).data)[(*SP).data.i]; /* SALOAD */\n"); break; case Opcodes.LALOAD: b.append(" CHECK_ARRAY_ACCESS(2, SP[-1].data.i); /* LALOAD */\n" + " SP--; SP[-1].type = CN1_TYPE_LONG; \n" + " SP[-1].data.l = LONG_ARRAY_LOOKUP((JAVA_ARRAY)SP[-1].data.o, (*SP).data.i);\n"); break; case Opcodes.FALOAD: b.append(" CHECK_ARRAY_ACCESS(2, SP[-1].data.i); /* FALOAD */\n" + " SP--; SP[-1].type = CN1_TYPE_FLOAT; \n" + " SP[-1].data.f = FLOAT_ARRAY_LOOKUP((JAVA_ARRAY)SP[-1].data.o, (*SP).data.i);\n"); break; case Opcodes.DALOAD: b.append(" CHECK_ARRAY_ACCESS(2, SP[-1].data.i); /* DALOAD */\n" + " SP--; SP[-1].type = CN1_TYPE_DOUBLE; \n" + " SP[-1].data.d = DOUBLE_ARRAY_LOOKUP((JAVA_ARRAY)SP[-1].data.o, (*SP).data.i);\n"); break; case Opcodes.AALOAD: b.append(" CHECK_ARRAY_ACCESS(2, SP[-1].data.i); /* AALOAD */\n" + " SP--; SP[-1].type = CN1_TYPE_INVALID; \n" + " SP[-1].data.o = ((JAVA_ARRAY_OBJECT*) (*(JAVA_ARRAY)SP[-1].data.o).data)[(*SP).data.i]; \n" + " SP[-1].type = CN1_TYPE_OBJECT; \n"); break; case Opcodes.BASTORE: b.append(" CHECK_ARRAY_ACCESS(3, SP[-2].data.i); /* BASTORE */\n" + " ((JAVA_ARRAY_BYTE*) (*(JAVA_ARRAY)SP[-3].data.o).data)[SP[-2].data.i] = SP[-1].data.i; SP -= 3;\n"); break; case Opcodes.CASTORE: b.append(" CHECK_ARRAY_ACCESS(3, SP[-2].data.i); /* CASTORE */\n" + " ((JAVA_ARRAY_CHAR*) (*(JAVA_ARRAY)SP[-3].data.o).data)[SP[-2].data.i] = SP[-1].data.i; SP -= 3;\n\n"); break; case Opcodes.SASTORE: b.append(" CHECK_ARRAY_ACCESS(3, SP[-2].data.i); /* SASTORE */\n" + " ((JAVA_ARRAY_SHORT*) (*(JAVA_ARRAY)SP[-3].data.o).data)[SP[-2].data.i] = SP[-1].data.i; SP -= 3;\n"); break; case Opcodes.IASTORE: b.append(" CHECK_ARRAY_ACCESS(3, SP[-2].data.i); /* IASTORE */\n" + " ((JAVA_ARRAY_INT*) (*(JAVA_ARRAY)SP[-3].data.o).data)[SP[-2].data.i] = SP[-1].data.i; SP -= 3;\n"); break; case Opcodes.LASTORE: b.append(" CHECK_ARRAY_ACCESS(3, SP[-2].data.i); /* LASTORE */\n" + " LONG_ARRAY_LOOKUP((JAVA_ARRAY)SP[-3].data.o, SP[-2].data.i) = SP[-1].data.l; SP -= 3;\n"); break; case Opcodes.FASTORE: b.append(" CHECK_ARRAY_ACCESS(3, SP[-2].data.i); /* FASTORE */\n" + " FLOAT_ARRAY_LOOKUP((JAVA_ARRAY)SP[-3].data.o, SP[-2].data.i) = SP[-1].data.f; SP -= 3;\n"); break; case Opcodes.DASTORE: b.append(" CHECK_ARRAY_ACCESS(3, SP[-2].data.i); /* DASTORE */\n" + " DOUBLE_ARRAY_LOOKUP((JAVA_ARRAY)SP[-3].data.o, SP[-2].data.i) = SP[-1].data.d; SP -= 3;\n"); break; case Opcodes.AASTORE: b.append(" CHECK_ARRAY_ACCESS(3, SP[-2].data.i); { /* BC_AASTORE */\n" + " JAVA_OBJECT aastoreTmp = SP[-3].data.o; \n" + " ((JAVA_ARRAY_OBJECT*) (*(JAVA_ARRAY)aastoreTmp).data)[SP[-2].data.i] = SP[-1].data.o; \n" + " SP -= 3; }\n"); break; case Opcodes.POP: b.append(" SP--; /* POP */\n"); break; case Opcodes.POP2: b.append(" popMany(threadStateData, 2, &SP); /* POP2 */\n"); break; /*case Opcodes.DUP: b.append(" PUSH_INT(PEEK_INT(1));\n"); break; case Opcodes.DUP_X1: b.append(" DUP_X1();\n"); break; case Opcodes.DUP_X2: b.append(" DUP_X2();\n"); break;*/ case Opcodes.DUP: b.append(" BC_DUP(); /* DUP */\n"); break; case Opcodes.DUP2: b.append(" BC_DUP2(); /* DUP2 */\n"); break; case Opcodes.DUP_X1: b.append(" BC_DUP2_X1(); /* DUP_X1 */\n"); break; case Opcodes.DUP2_X1: b.append(" BC_DUP2_X1(); /* DUP2_X1 */\n"); break; case Opcodes.DUP_X2: b.append(" BC_DUP2_X2(); /* DUP_X2 */\n"); break; case Opcodes.DUP2_X2: b.append(" BC_DUP2_X2(); /* DUP2_X2 */\n"); break; case Opcodes.SWAP: b.append(" swapStack(SP); /* SWAP */\n"); break; case Opcodes.IADD: b.append(" SP--; SP[-1].data.i = SP[-1].data.i + (*SP).data.i; /* IADD */\n"); break; case Opcodes.LADD: b.append(" SP--; SP[-1].data.l = SP[-1].data.l + (*SP).data.l; /* LADD */\n"); break; case Opcodes.FADD: b.append(" SP--; SP[-1].data.f = SP[-1].data.f + (*SP).data.f; /* FADD */\n"); break; case Opcodes.DADD: b.append(" SP--; SP[-1].data.d = SP[-1].data.d + (*SP).data.d; /* DADD */\n"); break; case Opcodes.ISUB: b.append(" SP--; SP[-1].data.i = (SP[-1].data.i - (*SP).data.i); /* ISUB */\n"); break; case Opcodes.LSUB: b.append(" SP--; SP[-1].data.l = (SP[-1].data.l - (*SP).data.l); /* LSUB */\n"); break; case Opcodes.FSUB: b.append(" SP--; SP[-1].data.f = (SP[-1].data.f - (*SP).data.f); /* FSUB */\n"); break; case Opcodes.DSUB: b.append(" SP--; SP[-1].data.d = (SP[-1].data.d - (*SP).data.d); /* DSUB */\n"); break; case Opcodes.IMUL: b.append(" SP--; SP[-1].data.i = SP[-1].data.i * (*SP).data.i; /* IMUL */\n"); break; case Opcodes.LMUL: b.append(" SP--; SP[-1].data.l = SP[-1].data.l * (*SP).data.l; /* LMUL */\n"); break; case Opcodes.FMUL: b.append(" SP--; SP[-1].data.f = SP[-1].data.f * (*SP).data.f; /* FMUL */\n"); break; case Opcodes.DMUL: b.append(" SP--; SP[-1].data.d = SP[-1].data.d * (*SP).data.d; /* DMUL */\n"); break; case Opcodes.IDIV: b.append(" SP--; SP[-1].data.i = SP[-1].data.i / (*SP).data.i; /* IDIV */\n"); break; case Opcodes.LDIV: b.append(" SP--; SP[-1].data.l = SP[-1].data.l / (*SP).data.l; /* LDIV */\n"); break; case Opcodes.FDIV: b.append(" SP--; SP[-1].data.f = SP[-1].data.f / (*SP).data.f; /* FDIV */\n"); break; case Opcodes.DDIV: b.append(" SP--; SP[-1].data.d = SP[-1].data.d / (*SP).data.d; /* DDIV */\n"); break; case Opcodes.IREM: b.append(" SP--; SP[-1].data.i = SP[-1].data.i % (*SP).data.i; /* IREM */\n"); break; case Opcodes.LREM: b.append(" SP--; SP[-1].data.l = SP[-1].data.l % (*SP).data.l; /* LREM */\n"); break; case Opcodes.FREM: b.append(" SP--; SP[-1].data.f = fmod(SP[-1].data.f, (*SP).data.f); /* FREM */\n"); break; case Opcodes.DREM: b.append(" SP--; SP[-1].data.d = fmod(SP[-1].data.d, (*SP).data.d); /* DREM */\n"); break; case Opcodes.INEG: b.append(" SP[-1].data.i *= -1; /* INEG */\n"); break; case Opcodes.LNEG: b.append(" SP[-1].data.l *= -1; /* LNEG */\n"); break; case Opcodes.FNEG: b.append(" SP[-1].data.f *= -1; /* FNEG */\n"); break; case Opcodes.DNEG: b.append(" SP[-1].data.d *= -1; /* DNEG */\n"); break; case Opcodes.ISHL: b.append(" SP--; SP[-1].data.i = (SP[-1].data.i << (0x1f & (*SP).data.i)); /* ISHL */\n"); break; case Opcodes.LSHL: b.append(" SP--; SP[-1].data.l = (SP[-1].data.l << (0x3f & (*SP).data.i)); /* LSHL */\n"); break; case Opcodes.ISHR: b.append(" SP--; SP[-1].data.i = (SP[-1].data.i >> (0x1f & (*SP).data.i)); /* ISHR */\n"); break; case Opcodes.LSHR: b.append(" SP--; SP[-1].data.l = (SP[-1].data.l >> (0x3f & (*SP).data.l)); /* LSHR */\n"); break; case Opcodes.IUSHR: b.append( " SP--; SP[-1].data.i = (((unsigned int)SP[-1].data.i) >> (0x1f & ((unsigned int)(*SP).data.i))); /* IUSHR */\n"); break; case Opcodes.LUSHR: b.append( " SP--; SP[-1].data.l = (((unsigned long long)SP[-1].data.l) >> (0x3f & ((unsigned long long)(*SP).data.i))); /* LUSHR */\n"); break; case Opcodes.IAND: b.append(" SP--; SP[-1].data.i = SP[-1].data.i & (*SP).data.i; /* IAND */\n"); break; case Opcodes.LAND: b.append(" SP--; SP[-1].data.l = SP[-1].data.l & (*SP).data.l; /* LAND */\n"); break; case Opcodes.IOR: b.append(" SP--; SP[-1].data.i = SP[-1].data.i | (*SP).data.i; /* IOR */\n"); break; case Opcodes.LOR: b.append(" SP--; SP[-1].data.l = SP[-1].data.l | (*SP).data.l; /* LOR */\n"); break; case Opcodes.IXOR: b.append(" SP--; SP[-1].data.i = SP[-1].data.i ^ (*SP).data.i; /* IXOR */\n"); break; case Opcodes.LXOR: b.append(" SP--; SP[-1].data.l = SP[-1].data.l ^ (*SP).data.l; /* LXOR */\n"); break; case Opcodes.I2L: b.append(" SP[-1].data.l = SP[-1].data.i; /* I2L */\n"); break; case Opcodes.I2F: b.append(" SP[-1].data.f = (JAVA_FLOAT)SP[-1].data.i; /* I2F */\n"); break; case Opcodes.I2D: b.append(" SP[-1].data.d = SP[-1].data.i; /* I2D */;\n"); break; case Opcodes.L2I: b.append(" SP[-1].data.i = (JAVA_INT)SP[-1].data.l; /* L2I */\n"); break; case Opcodes.L2F: b.append(" SP[-1].data.f = (JAVA_FLOAT)SP[-1].data.l; /* L2F */\n"); break; case Opcodes.L2D: b.append(" SP[-1].data.d = (JAVA_DOUBLE)SP[-1].data.l; /* L2D */\n"); break; case Opcodes.F2I: b.append(" SP[-1].data.i = (JAVA_INT)SP[-1].data.f; /* F2I */\n"); break; case Opcodes.F2L: b.append(" SP[-1].data.l = (JAVA_LONG)SP[-1].data.f; /* F2L */\n"); break; case Opcodes.F2D: b.append(" SP[-1].data.d = SP[-1].data.f; /* F2D */\n"); break; case Opcodes.D2I: b.append(" SP[-1].data.i = (JAVA_INT)SP[-1].data.d; /* D2I */\n"); break; case Opcodes.D2L: b.append(" SP[-1].data.l = (JAVA_LONG)SP[-1].data.d; /* D2L */\n"); break; case Opcodes.D2F: b.append(" SP[-1].data.f = (JAVA_FLOAT)SP[-1].data.d; /* D2F */\n"); break; case Opcodes.I2B: b.append(" SP[-1].data.i = ((SP[-1].data.i << 24) >> 24); /* I2B */\n"); break; case Opcodes.I2C: b.append(" SP[-1].data.i = (SP[-1].data.i & 0xffff); /* I2C */\n"); break; case Opcodes.I2S: b.append(" SP[-1].data.i = ((SP[-1].data.i << 16) >> 16); /* I2S */\n"); break; case Opcodes.LCMP: b.append(" BC_LCMP();\n"); break; case Opcodes.FCMPG: case Opcodes.FCMPL: b.append(" BC_FCMPL();\n"); break; case Opcodes.DCMPL: case Opcodes.DCMPG: b.append(" BC_DCMPL();\n"); break; case Opcodes.IRETURN: appendSynchronized(b); if (TryCatch.isTryCatchInMethod()) { b.append( " releaseForReturnInException(threadStateData, cn1LocalsBeginInThread, methodBlockOffset); return SP[-1].data.i;\n"); // b.append(maxLocals); // b.append(", stack, locals, methodBlockOffset); \n return SP[-1].data.i;\n"); } else { b.append(" releaseForReturn(threadStateData, cn1LocalsBeginInThread); return SP[-1].data.i;\n"); // b.append(maxLocals); // b.append(", stack, locals); \n return SP[-1].data.i;\n"); } break; case Opcodes.LRETURN: appendSynchronized(b); if (TryCatch.isTryCatchInMethod()) { b.append( " releaseForReturnInException(threadStateData, cn1LocalsBeginInThread, methodBlockOffset); \n return POP_LONG();\n"); } else { b.append( " releaseForReturn(threadStateData, cn1LocalsBeginInThread); \n return POP_LONG();\n"); } break; case Opcodes.FRETURN: appendSynchronized(b); if (TryCatch.isTryCatchInMethod()) { b.append( " releaseForReturnInException(threadStateData, cn1LocalsBeginInThread, methodBlockOffset); \n return POP_FLOAT();\n"); } else { b.append( " releaseForReturn(threadStateData, cn1LocalsBeginInThread); \n return POP_FLOAT();\n"); } break; case Opcodes.DRETURN: appendSynchronized(b); if (TryCatch.isTryCatchInMethod()) { b.append( " releaseForReturnInException(threadStateData, cn1LocalsBeginInThread, methodBlockOffset); \n return POP_DOUBLE();\n"); } else { b.append( " releaseForReturn(threadStateData, cn1LocalsBeginInThread); \n return POP_DOUBLE();\n"); } break; case Opcodes.ARETURN: appendSynchronized(b); if (TryCatch.isTryCatchInMethod()) { b.append( " releaseForReturnInException(threadStateData, cn1LocalsBeginInThread, methodBlockOffset); \n return POP_OBJ();\n"); } else { b.append( " releaseForReturn(threadStateData, cn1LocalsBeginInThread); \n return POP_OBJ();\n"); } break; case Opcodes.RETURN: appendSynchronized(b); if (!hasInstructions) { b.append(" return;\n"); break; } if (TryCatch.isTryCatchInMethod()) { b.append( " releaseForReturnInException(threadStateData, cn1LocalsBeginInThread, methodBlockOffset); \n return;\n"); } else { b.append(" releaseForReturn(threadStateData, cn1LocalsBeginInThread); \n return;\n"); } break; case Opcodes.ARRAYLENGTH: b.append(" { /* ARRAYLENGTH */\n" + " if(SP[-1].data.o == JAVA_NULL) { \n" + " throwException(threadStateData, __NEW_INSTANCE_java_lang_NullPointerException(threadStateData)); \n" + " }; \n" + " SP[-1].type = CN1_TYPE_INT; \n" + " SP[-1].data.i = (*((JAVA_ARRAY)SP[-1].data.o)).length; \n" + " }\n"); break; case Opcodes.ATHROW: //b.append(" NSLog(@\"Exception thrown %s %d %s %s\\n\", __FILE__, __LINE__, __PRETTY_FUNCTION__, __FUNCTION__);\n"); b.append(" throwException(threadStateData, POP_OBJ());\n"); break; case Opcodes.MONITORENTER: b.append(" monitorEnter(threadStateData, POP_OBJ());\n"); break; case Opcodes.MONITOREXIT: b.append(" monitorExit(threadStateData, POP_OBJ());\n"); break; // int instructions case Opcodes.SIPUSH: case Opcodes.BIPUSH: b.append(" PUSH_INT("); b.append(value); b.append(");\n"); break; case Opcodes.NEWARRAY: switch (value) { case 4: // boolean b.append( " SP--; PUSH_OBJ(allocArray(threadStateData, (*SP).data.i, &class_array1__JAVA_BOOLEAN, sizeof(JAVA_ARRAY_BOOLEAN), 1));\n"); break; case 5: // char b.append( " SP--; PUSH_OBJ(allocArray(threadStateData, (*SP).data.i, &class_array1__JAVA_CHAR, sizeof(JAVA_ARRAY_CHAR), 1));\n"); break; case 6: // float b.append( " SP--; PUSH_OBJ(allocArray(threadStateData, (*SP).data.i, &class_array1__JAVA_FLOAT, sizeof(JAVA_ARRAY_FLOAT), 1));\n"); break; case 7: // double b.append( " SP--; PUSH_OBJ(allocArray(threadStateData, (*SP).data.i, &class_array1__JAVA_DOUBLE, sizeof(JAVA_ARRAY_DOUBLE), 1));\n"); break; case 8: // byte b.append( " SP--; PUSH_OBJ(allocArray(threadStateData, (*SP).data.i, &class_array1__JAVA_BYTE, sizeof(JAVA_ARRAY_BYTE), 1));\n"); break; case 9: // short b.append( " SP--; PUSH_OBJ(allocArray(threadStateData, (*SP).data.i, &class_array1__JAVA_SHORT, sizeof(JAVA_ARRAY_SHORT), 1));\n"); break; case 10: // int b.append( " SP--; PUSH_OBJ(allocArray(threadStateData, (*SP).data.i, &class_array1__JAVA_INT, sizeof(JAVA_ARRAY_INT), 1));\n"); break; case 11: // long b.append( " SP--; PUSH_OBJ(allocArray(threadStateData, (*SP).data.i, &class_array1__JAVA_LONG, sizeof(JAVA_ARRAY_LONG), 1));\n"); break; } break; } }
From source file:com.codename1.tools.translator.Util.java
License:Open Source License
public static char[] getStackInputTypes(Instruction instr) { char[] out = instr.getStackInputTypes(); if (out != null) { return out; }/* w w w.ja v a2 s .c om*/ switch (instr.getOpcode()) { case Opcodes.NOP: case Opcodes.ACONST_NULL: case Opcodes.ICONST_M1: case Opcodes.ICONST_0: case Opcodes.ICONST_2: case Opcodes.ICONST_3: case Opcodes.ICONST_4: case Opcodes.ICONST_5: case Opcodes.LCONST_0: case Opcodes.LCONST_1: case Opcodes.FCONST_0: case Opcodes.FCONST_1: case Opcodes.FCONST_2: case Opcodes.DCONST_0: case Opcodes.DCONST_1: case Opcodes.SIPUSH: case Opcodes.BIPUSH: return new char[0]; case Opcodes.BALOAD: case Opcodes.CALOAD: case Opcodes.IALOAD: case Opcodes.SALOAD: case Opcodes.LALOAD: case Opcodes.FALOAD: case Opcodes.DALOAD: case Opcodes.AALOAD: return new char[] { 'i', 'o' }; case Opcodes.BASTORE: case Opcodes.CASTORE: case Opcodes.SASTORE: case Opcodes.IASTORE: return new char[] { 'i', 'i', 'o' }; case Opcodes.LASTORE: return new char[] { 'l', 'i', 'o' }; case Opcodes.FASTORE: return new char[] { 'f', 'i', 'o' }; case Opcodes.DASTORE: return new char[] { 'd', 'i', 'o' }; case Opcodes.AASTORE: return new char[] { 'o', 'i', 'o' }; case Opcodes.POP: return new char[] { '*' }; case Opcodes.POP2: return new char[] { '*', '*' }; case Opcodes.DUP: return new char[] { '0' }; case Opcodes.DUP2: case Opcodes.DUP_X2: case Opcodes.DUP2_X2: return null; // DUP2 depends on the types on the stack so we don't statically know the input types case Opcodes.DUP_X1: case Opcodes.DUP2_X1: return new char[] { '0', '1' }; case Opcodes.SWAP: return new char[] { '0', '1' }; case Opcodes.IADD: case Opcodes.ISUB: case Opcodes.IMUL: case Opcodes.IDIV: case Opcodes.IREM: case Opcodes.ISHL: case Opcodes.ISHR: case Opcodes.IUSHR: case Opcodes.IAND: case Opcodes.IOR: case Opcodes.IXOR: return new char[] { 'i', 'i' }; case Opcodes.LADD: case Opcodes.LSUB: case Opcodes.LMUL: case Opcodes.LDIV: case Opcodes.LREM: case Opcodes.LSHL: case Opcodes.LSHR: case Opcodes.LAND: case Opcodes.LOR: case Opcodes.LXOR: case Opcodes.LCMP: return new char[] { 'l', 'l' }; case Opcodes.FADD: case Opcodes.FSUB: case Opcodes.FMUL: case Opcodes.FDIV: case Opcodes.FREM: case Opcodes.FCMPG: case Opcodes.FCMPL: return new char[] { 'f', 'f' }; case Opcodes.DADD: case Opcodes.DSUB: case Opcodes.DMUL: case Opcodes.DDIV: case Opcodes.DREM: case Opcodes.DCMPL: case Opcodes.DCMPG: return new char[] { 'd', 'd' }; case Opcodes.INEG: case Opcodes.I2L: case Opcodes.I2F: case Opcodes.I2D: case Opcodes.I2B: case Opcodes.I2C: case Opcodes.I2S: case Opcodes.NEWARRAY: return new char[] { 'i' }; case Opcodes.LNEG: case Opcodes.L2I: case Opcodes.L2F: case Opcodes.L2D: return new char[] { 'l' }; case Opcodes.FNEG: case Opcodes.F2I: case Opcodes.F2L: case Opcodes.F2D: return new char[] { 'f' }; case Opcodes.DNEG: case Opcodes.D2I: case Opcodes.D2L: case Opcodes.D2F: return new char[] { 'd' }; case Opcodes.LUSHR: return new char[] { 'i', 'l' }; case Opcodes.ARRAYLENGTH: case Opcodes.MONITORENTER: case Opcodes.MONITOREXIT: case Opcodes.ATHROW: return new char[] { 'o' }; default: return null; } }
From source file:com.codename1.tools.translator.Util.java
License:Open Source License
public static char[] getStackOutputTypes(Instruction instr) { char[] out = instr.getStackOutputTypes(); if (out != null) { return out; }//www .jav a 2 s . c o m switch (instr.getOpcode()) { case Opcodes.NOP: case Opcodes.BASTORE: case Opcodes.CASTORE: case Opcodes.SASTORE: case Opcodes.IASTORE: case Opcodes.LASTORE: case Opcodes.FASTORE: case Opcodes.DASTORE: case Opcodes.AASTORE: case Opcodes.POP: case Opcodes.POP2: case Opcodes.MONITORENTER: case Opcodes.MONITOREXIT: case Opcodes.ATHROW: return new char[0]; case Opcodes.ACONST_NULL: case Opcodes.AALOAD: case Opcodes.NEWARRAY: return new char[] { 'o' }; case Opcodes.ICONST_M1: case Opcodes.ICONST_0: case Opcodes.ICONST_1: case Opcodes.ICONST_2: case Opcodes.ICONST_3: case Opcodes.ICONST_4: case Opcodes.ICONST_5: case Opcodes.BALOAD: case Opcodes.CALOAD: case Opcodes.IALOAD: case Opcodes.SALOAD: case Opcodes.IADD: case Opcodes.ISUB: case Opcodes.IMUL: case Opcodes.IDIV: case Opcodes.IREM: case Opcodes.INEG: case Opcodes.ISHL: case Opcodes.ISHR: case Opcodes.IUSHR: case Opcodes.IAND: case Opcodes.IOR: case Opcodes.IXOR: case Opcodes.F2I: case Opcodes.D2I: case Opcodes.L2I: case Opcodes.I2C: case Opcodes.I2S: case Opcodes.LCMP: case Opcodes.FCMPG: case Opcodes.FCMPL: case Opcodes.DCMPL: case Opcodes.DCMPG: case Opcodes.ARRAYLENGTH: case Opcodes.SIPUSH: case Opcodes.BIPUSH: return new char[] { 'i' }; case Opcodes.LCONST_0: case Opcodes.LCONST_1: case Opcodes.LALOAD: case Opcodes.LADD: case Opcodes.LSUB: case Opcodes.LMUL: case Opcodes.LDIV: case Opcodes.LREM: case Opcodes.LNEG: case Opcodes.LSHL: case Opcodes.LSHR: case Opcodes.LUSHR: case Opcodes.LAND: case Opcodes.LOR: case Opcodes.LXOR: case Opcodes.I2L: case Opcodes.F2L: case Opcodes.D2L: return new char[] { 'l' }; case Opcodes.FCONST_0: case Opcodes.FCONST_1: case Opcodes.FCONST_2: case Opcodes.FALOAD: case Opcodes.FADD: case Opcodes.FSUB: case Opcodes.FMUL: case Opcodes.FDIV: case Opcodes.FREM: case Opcodes.FNEG: case Opcodes.I2F: case Opcodes.D2F: case Opcodes.L2F: return new char[] { 'f' }; case Opcodes.DCONST_0: case Opcodes.DCONST_1: case Opcodes.DALOAD: case Opcodes.DADD: case Opcodes.DSUB: case Opcodes.DMUL: case Opcodes.DDIV: case Opcodes.DREM: case Opcodes.DNEG: case Opcodes.I2D: case Opcodes.F2D: case Opcodes.L2D: return new char[] { 'd' }; case Opcodes.DUP: return new char[] { '0', '0' }; case Opcodes.DUP2: case Opcodes.DUP_X2: case Opcodes.DUP2_X2: return null; case Opcodes.DUP_X1: case Opcodes.DUP2_X1: return new char[] { '0', '1', '0' }; case Opcodes.SWAP: return new char[] { '1', '0' }; default: return null; } }
From source file:com.foxelbox.spigotpatcher.patchers.HideShowPlayerPatcher.java
License:Open Source License
@Override public MethodVisitor getVisitor(int api, MethodVisitor parent) { return new MethodPatcherVisitor(api, parent) { @Override//from w ww . j a v a 2s . c om protected boolean checkMethodInsn(int opcode, String clazz, String name, String desc) { if (opcode == Opcodes.INVOKEVIRTUAL && clazz.endsWith("/PlayerConnection") && name.equals("sendPacket")) { visitInsn(Opcodes.POP); visitInsn(Opcodes.ACONST_NULL); System.out.println("HideShowPatcher: PATCHED (2 times = OK)"); } return true; } }; }
From source file:com.foxelbox.spigotpatcher.patchers.OnPlayerJoinDisconnectPatcher.java
License:Open Source License
@Override public MethodVisitor getVisitor(int api, MethodVisitor parent) { return new MethodVisitor(api, parent) { protected void checkMethodInsn(int opcode, String clazz, String name, String desc) { if (opcode == Opcodes.INVOKEVIRTUAL && clazz.endsWith("/CraftPlayer") && name.equals("canSee")) { visitInsn(Opcodes.POP); visitInsn(Opcodes.ICONST_1); System.out.println("OnJoinPatcher: PATCHED (3 times = OK)"); }/* w w w . j av a2 s. co m*/ } @Override public void visitMethodInsn(int opcode, String clazz, String name, String desc, boolean isInterface) { super.visitMethodInsn(opcode, clazz, name, desc, isInterface); checkMethodInsn(opcode, clazz, name, desc); } @Override public void visitMethodInsn(int opcode, String clazz, String name, String desc) { super.visitMethodInsn(opcode, clazz, name, desc); checkMethodInsn(opcode, clazz, name, desc); } }; }
From source file:com.github.anba.es6draft.compiler.assembler.InstructionAssembler.java
License:Open Source License
public void pop() { methodVisitor.visitInsn(Opcodes.POP); stack.pop(); }
From source file:com.github.malamut2.low.AllocationMethodAdapter.java
License:Apache License
private void pushProductOfIntArrayOnStack() { Label beginScopeLabel = new Label(); Label endScopeLabel = new Label(); int dimsArrayIndex = newLocal("[I", beginScopeLabel, endScopeLabel); int counterIndex = newLocal("I", beginScopeLabel, endScopeLabel); int productIndex = newLocal("I", beginScopeLabel, endScopeLabel); Label loopLabel = new Label(); Label endLabel = new Label(); super.visitLabel(beginScopeLabel); // stack: ... intArray super.visitVarInsn(Opcodes.ASTORE, dimsArrayIndex); // -> stack: ... // counter = 0 super.visitInsn(Opcodes.ICONST_0); super.visitVarInsn(Opcodes.ISTORE, counterIndex); // product = 1 super.visitInsn(Opcodes.ICONST_1); super.visitVarInsn(Opcodes.ISTORE, productIndex); // loop:// w ww. ja v a2 s . com super.visitLabel(loopLabel); // if index >= arraylength goto end: super.visitVarInsn(Opcodes.ILOAD, counterIndex); super.visitVarInsn(Opcodes.ALOAD, dimsArrayIndex); super.visitInsn(Opcodes.ARRAYLENGTH); super.visitJumpInsn(Opcodes.IF_ICMPGE, endLabel); // product = product * max(array[counter],1) super.visitVarInsn(Opcodes.ALOAD, dimsArrayIndex); super.visitVarInsn(Opcodes.ILOAD, counterIndex); super.visitInsn(Opcodes.IALOAD); super.visitInsn(Opcodes.DUP); Label nonZeroDimension = new Label(); super.visitJumpInsn(Opcodes.IFNE, nonZeroDimension); super.visitInsn(Opcodes.POP); super.visitInsn(Opcodes.ICONST_1); super.visitLabel(nonZeroDimension); super.visitVarInsn(Opcodes.ILOAD, productIndex); super.visitInsn(Opcodes.IMUL); // if overflow happens it happens. super.visitVarInsn(Opcodes.ISTORE, productIndex); // iinc counter 1 super.visitIincInsn(counterIndex, 1); // goto loop super.visitJumpInsn(Opcodes.GOTO, loopLabel); // end: super.visitLabel(endLabel); // re-push dimensions array super.visitVarInsn(Opcodes.ALOAD, dimsArrayIndex); // push product super.visitVarInsn(Opcodes.ILOAD, productIndex); super.visitLabel(endScopeLabel); }
From source file:com.github.malamut2.low.AllocationMethodAdapter.java
License:Apache License
/** * Reflection-based allocation (@see java.lang.reflect.Array#newInstance) is * triggered with a static method call (INVOKESTATIC), so we hook it here. * Class initialization is triggered with a constructor call (INVOKESPECIAL) * so we hook that here too as a proxy for the new bytecode which leaves an * uninitialized object on the stack that we're not allowed to touch. * {@link java.lang.Object#clone} is also a call to INVOKESPECIAL, * and is hooked here. {@link java.lang.Class#newInstance} and * {@link java.lang.reflect.Constructor#newInstance} are both * INVOKEVIRTUAL calls, so they are hooked here, as well. *//*from w ww . ja va 2s .c o m*/ @Override public void visitMethodInsn(int opcode, String owner, String name, String signature, boolean itf) { if (opcode == Opcodes.INVOKESTATIC && // Array does its own native allocation. Grr. owner.equals("java/lang/reflect/Array") && name.equals("newInstance")) { if (signature.equals("(Ljava/lang/Class;I)Ljava/lang/Object;")) { Label beginScopeLabel = new Label(); Label endScopeLabel = new Label(); super.visitLabel(beginScopeLabel); // stack: ... class count int countIndex = newLocal("I", beginScopeLabel, endScopeLabel); super.visitVarInsn(Opcodes.ISTORE, countIndex); // -> stack: ... class pushClassNameOnStack(); // -> stack: ... class className int typeNameIndex = newLocal("Ljava/lang/String;", beginScopeLabel, endScopeLabel); super.visitVarInsn(Opcodes.ASTORE, typeNameIndex); // -> stack: ... class super.visitVarInsn(Opcodes.ILOAD, countIndex); // -> stack: ... class count super.visitMethodInsn(opcode, owner, name, signature, itf); // -> stack: ... newobj super.visitInsn(Opcodes.DUP); // -> stack: ... newobj newobj super.visitVarInsn(Opcodes.ILOAD, countIndex); // -> stack: ... newobj newobj count super.visitInsn(Opcodes.SWAP); // -> stack: ... newobj count newobj super.visitVarInsn(Opcodes.ALOAD, typeNameIndex); super.visitLabel(endScopeLabel); // -> stack: ... newobj count newobj className super.visitInsn(Opcodes.SWAP); // -> stack: ... newobj count className newobj super.visitMethodInsn(Opcodes.INVOKESTATIC, recorderClass, recorderMethod, RECORDER_SIGNATURE, false); // -> stack: ... newobj return; } else if (signature.equals("(Ljava/lang/Class;[I)Ljava/lang/Object;")) { Label beginScopeLabel = new Label(); Label endScopeLabel = new Label(); super.visitLabel(beginScopeLabel); int dimsArrayIndex = newLocal("[I", beginScopeLabel, endScopeLabel); // stack: ... class dimsArray pushProductOfIntArrayOnStack(); // -> stack: ... class dimsArray product int productIndex = newLocal("I", beginScopeLabel, endScopeLabel); super.visitVarInsn(Opcodes.ISTORE, productIndex); // -> stack: ... class dimsArray super.visitVarInsn(Opcodes.ASTORE, dimsArrayIndex); // -> stack: ... class pushClassNameOnStack(); // -> stack: ... class className int typeNameIndex = newLocal("Ljava/lang/String;", beginScopeLabel, endScopeLabel); super.visitVarInsn(Opcodes.ASTORE, typeNameIndex); // -> stack: ... class super.visitVarInsn(Opcodes.ALOAD, dimsArrayIndex); // -> stack: ... class dimsArray super.visitMethodInsn(opcode, owner, name, signature, itf); // -> stack: ... newobj super.visitInsn(Opcodes.DUP); // -> stack: ... newobj newobj super.visitVarInsn(Opcodes.ILOAD, productIndex); // -> stack: ... newobj newobj product super.visitInsn(Opcodes.SWAP); // -> stack: ... newobj product newobj super.visitVarInsn(Opcodes.ALOAD, typeNameIndex); super.visitLabel(endScopeLabel); // -> stack: ... newobj product newobj className super.visitInsn(Opcodes.SWAP); // -> stack: ... newobj product className newobj super.visitMethodInsn(Opcodes.INVOKESTATIC, recorderClass, recorderMethod, RECORDER_SIGNATURE, false); // -> stack: ... newobj return; } } if (opcode == Opcodes.INVOKEVIRTUAL) { if ("clone".equals(name) && owner.startsWith("[")) { super.visitMethodInsn(opcode, owner, name, signature, itf); int i = 0; while (i < owner.length()) { if (owner.charAt(i) != '[') { break; } i++; } if (i > 1) { // -> stack: ... newobj super.visitTypeInsn(Opcodes.CHECKCAST, owner); // -> stack: ... arrayref calculateArrayLengthAndDispatch(owner.substring(i), i); } else { // -> stack: ... newobj super.visitInsn(Opcodes.DUP); // -> stack: ... newobj newobj super.visitTypeInsn(Opcodes.CHECKCAST, owner); // -> stack: ... newobj arrayref super.visitInsn(Opcodes.ARRAYLENGTH); // -> stack: ... newobj length super.visitInsn(Opcodes.SWAP); // -> stack: ... length newobj invokeRecordAllocation(owner.substring(i)); } return; } } if (opcode == Opcodes.INVOKESPECIAL) { if (!"clone".equals(name) || !"java/lang/Object".equals(owner)) { if ("<init>".equals(name) && outstandingAllocs > 0) { // Tricky because superclass initializers mean there can be more calls // to <init> than calls to NEW; hence outstandingAllocs. --outstandingAllocs; // Most of the time (i.e. in bytecode generated by javac) it is the case // that following an <init> call the top of the stack has a reference ot // the newly-initialized object. But nothing in the JVM Spec requires // this, so we need to play games with the stack to make an explicit // extra copy (and then discard it). dupStackElementBeforeSignatureArgs(signature); super.visitMethodInsn(opcode, owner, name, signature, itf); super.visitLdcInsn(-1); super.visitInsn(Opcodes.SWAP); invokeRecordAllocation(owner); super.visitInsn(Opcodes.POP); return; } } } super.visitMethodInsn(opcode, owner, name, signature, itf); }
From source file:com.github.malamut2.low.AllocationMethodAdapter.java
License:Apache License
void calculateArrayLengthAndDispatch(String typeName, int dimCount) { // Since the dimensions of the array are not known at instrumentation // time, we take the created multi-dimensional array and peel off nesting // levels from the left. For each nesting layer we probe the array length // and accumulate a partial product which we can then feed the recording // function.// www . j av a2s.com // below we note the partial product of dimensions 1 to X-1 as productToX // (so productTo1 == 1 == no dimensions yet). We denote by aref0 the // array reference at the current nesting level (the containing aref's [0] // element). If we hit a level whose arraylength is 0 there's no point // continuing so we shortcut out. Label zeroDimension = new Label(); super.visitInsn(Opcodes.DUP); // -> stack: ... origaref aref0 super.visitLdcInsn(1); // -> stack: ... origaref aref0 productTo1 for (int i = 0; i < dimCount; ++i) { // pre: stack: ... origaref aref0 productToI super.visitInsn(Opcodes.SWAP); // -> stack: ... origaref productToI aref super.visitInsn(Opcodes.DUP_X1); // -> stack: ... origaref aref0 productToI aref super.visitInsn(Opcodes.ARRAYLENGTH); // -> stack: ... origaref aref0 productToI dimI Label nonZeroDimension = new Label(); super.visitInsn(Opcodes.DUP); // -> stack: ... origaref aref0 productToI dimI dimI super.visitJumpInsn(Opcodes.IFNE, nonZeroDimension); // -> stack: ... origaref aref0 productToI dimI super.visitInsn(Opcodes.POP); // -> stack: ... origaref aref0 productToI super.visitJumpInsn(Opcodes.GOTO, zeroDimension); super.visitLabel(nonZeroDimension); // -> stack: ... origaref aref0 productToI max(dimI,1) super.visitInsn(Opcodes.IMUL); // -> stack: ... origaref aref0 productTo{I+1} if (i < dimCount - 1) { super.visitInsn(Opcodes.SWAP); // -> stack: ... origaref productTo{I+1} aref0 super.visitInsn(Opcodes.ICONST_0); // -> stack: ... origaref productTo{I+1} aref0 0 super.visitInsn(Opcodes.AALOAD); // -> stack: ... origaref productTo{I+1} aref0' super.visitInsn(Opcodes.SWAP); } // post: stack: ... origaref aref0 productTo{I+1} } super.visitLabel(zeroDimension); super.visitInsn(Opcodes.SWAP); // -> stack: ... origaref product aref0 super.visitInsn(Opcodes.POP); // -> stack: ... origaref product super.visitInsn(Opcodes.SWAP); // -> stack: ... product origaref invokeRecordAllocation(typeName); }
From source file:com.github.rgcjonas.kuemmelgtr.core.Compiler.java
License:Open Source License
private static void compileCommon(TokenSource<RPNToken> source, MethodVisitor method, String variable) throws ParsingError { method.visitCode();//from w w w . j a va2 s. c o m // we now can compile our token stream int currentStackSize = 0; // we keep track of the current stack size to throw errors if we encounter an invalid instruction RPNToken t; while ((t = source.nextToken()) != null) { if (t instanceof RPNToken.Operand) { // we push it onto the stack method.visitLdcInsn(((RPNToken.Operand) t).getValue()); currentStackSize++; } else if (t instanceof RPNToken.Operator) { RPNToken.Operator op = (RPNToken.Operator) t; if (currentStackSize < op.getNumOperands()) throw new ParsingError(t.getSrcLine(), t.getSrcColumn(), "Missing operand(s)"); switch (op.getName()) { case "_add": method.visitInsn(Opcodes.DADD); currentStackSize--; break; case "_mult": method.visitInsn(Opcodes.DMUL); currentStackSize--; break; case "_sub": method.visitInsn(Opcodes.DSUB); currentStackSize--; break; case "_div": method.visitInsn(Opcodes.DDIV); currentStackSize--; break; case "_pow": method.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", "pow", "(DD)D"); currentStackSize--; break; default: //HACK: support every function in java/lang/Math. Will be way more performant than any lookup-and-evaluate //TODO: implement more functions inline if (currentStackSize < 1) throw new ParsingError(t.getSrcLine(), t.getSrcColumn(), "Missing operand"); try { Method meth = Math.class.getDeclaredMethod(op.getName(), double.class); // just check if it's available and hope it returns a double if (meth.getReturnType() != double.class) throw new NoSuchMethodException(); // we don't want to blow up at runtime, do we? method.visitMethodInsn(Opcodes.INVOKESTATIC, "java/lang/Math", op.getName(), "(D)D"); } catch (NoSuchMethodException e) { // we do not give up. The method may be available at runtime. method.visitVarInsn(Opcodes.ALOAD, 0); method.visitInsn(Opcodes.DUP_X2); // swap the this pointer and double method.visitInsn(Opcodes.POP); method.visitLdcInsn(op.getName()); method.visitLdcInsn((int) op.getSrcLine()); method.visitLdcInsn((int) op.getSrcColumn()); method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, CompiledClassBase.class.getName().replace('.', '/'), "resolveAndEvaluateFunction", "(DLjava/lang/String;II)D"); } } } else if (t instanceof RPNToken.VariableRecall) { // maybe, maybe the variable is an argument we can load if (variable != null && ((RPNToken.VariableRecall) t).getName().equalsIgnoreCase(variable)) { method.visitVarInsn(Opcodes.DLOAD, 1); } else { // we let our parent class do the hard work method.visitVarInsn(Opcodes.ALOAD, 0); method.visitLdcInsn(((RPNToken.VariableRecall) t).getName()); method.visitLdcInsn(t.getSrcLine()); method.visitLdcInsn(t.getSrcColumn()); method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, CompiledClassBase.class.getName().replace('.', '/'), "getVariable", "(Ljava/lang/String;II)D"); } currentStackSize++; } else if (t instanceof RPNToken.VariableAssignment) { // also defer to our parent class // we do not give up. The method may be available at runtime. method.visitVarInsn(Opcodes.ALOAD, 0); method.visitInsn(Opcodes.DUP_X2); // swap the this pointer and double method.visitInsn(Opcodes.POP); method.visitLdcInsn(((RPNToken.VariableAssignment) t).getVariableName()); method.visitLdcInsn(t.getSrcLine()); method.visitLdcInsn(t.getSrcColumn()); method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, CompiledClassBase.class.getName().replace('.', '/'), "setVariable", "(DLjava/lang/String;II)D"); } else { throw new ParsingError(t.getSrcLine(), t.getSrcColumn(), "Unknown instruction: " + t); } } if (currentStackSize != 1) throw new ParsingError(0, 0, "Expected stack to be one value, found " + currentStackSize); method.visitInsn(Opcodes.DRETURN); method.visitMaxs(0, 0); method.visitEnd(); }