📄 code-analyse.c
字号:
case DSUB: case DMUL: case DDIV: case DREM: STACKIN(2, TDOUBLE); STACKIN(3, TVOID); STACKIN(0, TDOUBLE); STACKIN(1, TVOID); STKPOP(2); STACKOUT(0, TDOUBLE); STACKOUT(1, TVOID); INCPC(1); break; case INEG: STACKIN(0, TINT); STACKOUT(0, TINT); INCPC(1); break; case LNEG: STACKIN(0, TLONG); STACKIN(1, TVOID); STACKOUT(0, TLONG); STACKOUT(1, TVOID); INCPC(1); break; case FNEG: STACKIN(0, TFLOAT); STACKOUT(0, TFLOAT); INCPC(1); break; case DNEG: STACKIN(0, TDOUBLE); STACKIN(1, TVOID); STACKOUT(0, TDOUBLE); STACKOUT(1, TVOID); INCPC(1); break; case ISHL: STACKIN(0, TINT); STACKIN(1, TINT); STKPOP(1); STACKOUT(0, TINT); INCPC(1); break; case ISHR: STACKIN(0, TINT); STACKIN(1, TINT); STKPOP(1); STACKOUT(0, TINT); INCPC(1); break; case IUSHR: STACKIN(0, TINT); STACKIN(1, TINT); STKPOP(1); STACKOUT(0, TINT); INCPC(1); break; case LSHL: case LSHR: case LUSHR: STACKIN(0, TINT); STACKIN(1, TLONG); STACKIN(2, TVOID); STKPOP(1); STACKOUT(0, TLONG); STACKOUT(1, TVOID); INCPC(1); break; case IINC: if (wide) { LOCALINOUT(WORD(pc+1), TINT); INCPC(2); wide = false; } else { LOCALINOUT(BYTE(pc+1), TINT); } INCPC(3); break; case I2L: STACKIN(0, TINT); STKPUSH(1); STACKOUT(0, TLONG); STACKOUT(1, TVOID); INCPC(1); break; case I2F: STACKIN(0, TINT); STACKOUT(0, TFLOAT); INCPC(1); break; case I2D: STACKIN(0, TINT); STKPUSH(1); STACKOUT(0, TDOUBLE); STACKOUT(1, TVOID); INCPC(1); break; case L2I: STACKIN(0, TLONG); STACKIN(1, TVOID); STKPOP(1); STACKOUT(0, TINT); INCPC(1); break; case L2F: STACKIN(0, TLONG); STACKIN(1, TVOID); STKPOP(1); STACKOUT(0, TFLOAT); INCPC(1); break; case L2D: STACKIN(0, TLONG); STACKIN(1, TVOID); STACKOUT(0, TDOUBLE); STACKOUT(1, TVOID); INCPC(1); break; case F2I: STACKIN(0, TFLOAT); STACKOUT(0, TINT); INCPC(1); break; case F2L: STACKIN(0, TFLOAT); STKPUSH(1); STACKOUT(0, TLONG); STACKOUT(1, TVOID); INCPC(1); break; case F2D: STACKIN(0, TFLOAT); STKPUSH(1); STACKOUT(0, TDOUBLE); STACKOUT(1, TVOID); INCPC(1); break; case D2I: STACKIN(0, TDOUBLE); STACKIN(1, TVOID); STKPOP(1); STACKOUT(0, TINT); INCPC(1); break; case D2L: STACKIN(0, TDOUBLE); STACKIN(1, TVOID); STACKOUT(0, TLONG); STACKOUT(1, TVOID); INCPC(1); break; case D2F: STACKIN(0, TDOUBLE); STACKIN(1, TVOID); STKPOP(1); STACKOUT(0, TFLOAT); INCPC(1); break; case INT2BYTE: case INT2CHAR: case INT2SHORT: STACKIN(0, TINT); STACKOUT(0, TINT); INCPC(1); break; case LCMP: STACKIN(2, TLONG); STACKIN(3, TVOID); STACKIN(0, TLONG); STACKIN(1, TVOID); STKPOP(3); STACKOUT(0, TINT); INCPC(1); break; case FCMPL: case FCMPG: STACKIN(1, TFLOAT); STACKIN(0, TFLOAT); STKPOP(1); STACKOUT(0, TINT); INCPC(1); break; case DCMPL: case DCMPG: STACKIN(2, TDOUBLE); STACKIN(3, TVOID); STACKIN(0, TDOUBLE); STACKIN(1, TVOID); STKPOP(3); STACKOUT(0, TINT); INCPC(1); break; case IFEQ: case IFNE: case IFLT: case IFGE: case IFGT: case IFLE: STACKIN(0, TINT); STKPOP(1); FRAMEMERGE(pc + WORD(pc+1), sp); FRAMEMERGE(pc + 3, sp); INCPC(3); break; case IF_ICMPEQ: case IF_ICMPNE: case IF_ICMPLT: case IF_ICMPGT: case IF_ICMPGE: case IF_ICMPLE: STACKIN(0, TINT); STACKIN(1, TINT); STKPOP(2); FRAMEMERGE(pc + WORD(pc+1), sp); FRAMEMERGE(pc + 3, sp); INCPC(3); break; case IF_ACMPEQ: case IF_ACMPNE: STACKIN(0, TOBJ); STACKIN(1, TOBJ); STKPOP(2); FRAMEMERGE(pc + WORD(pc+1), sp); FRAMEMERGE(pc + 3, sp); INCPC(3); break; case GOTO: FRAMEMERGE(pc + WORD(pc+1), sp); INCPC(3); break; case GOTO_W: FRAMEMERGE(pc + DWORD(pc+1), sp); INCPC(5); break; case JSR: STKPUSH(1); STACKOUT(0, TADDR); FRAMEMERGE(pc + WORD(pc+1), sp); STKPOP(1); FRAMEMERGE(pc + 3, sp); INCPC(3); break; case JSR_W: STKPUSH(1); STACKOUT(0, TADDR); FRAMEMERGE(pc + DWORD(pc+1), sp); STKPOP(1); FRAMEMERGE(pc + 5, sp); INCPC(5); break; case RET: LOCALIN(BYTE(pc+1), TADDR); INCPC(2); break; case LOOKUPSWITCH: STACKIN(0, TINT); STKPOP(1); tabpc = (pc + 4) & -4; idx = DWORD(tabpc+4); for (; idx > 0; idx--) { FRAMEMERGE(pc+DWORD(tabpc+idx*8+4), sp); } FRAMEMERGE(pc + DWORD(tabpc), sp); pc = tabpc + (DWORD(tabpc+4)+1) * 8; break; case TABLESWITCH: STACKIN(0, TINT); STKPOP(1); tabpc = (pc + 4) & -4; idx = DWORD(tabpc+8)-DWORD(tabpc+4)+1; for (; idx > 0; idx--) { FRAMEMERGE(pc+DWORD(tabpc+idx*4+8), sp); } FRAMEMERGE(pc + DWORD(tabpc), sp); pc = tabpc + (DWORD(tabpc+8)-DWORD(tabpc+4)+1+3) * 4; break; case IRETURN: STACKIN(0, TINT); STKPOP(1); INCPC(1); break; case LRETURN: STACKIN(0, TLONG); STACKIN(1, TVOID); STKPOP(2); INCPC(1); break; case FRETURN: STACKIN(0, TFLOAT); STKPOP(1); INCPC(1); break; case DRETURN: STACKIN(0, TDOUBLE); STACKIN(1, TVOID); STKPOP(2); INCPC(1); break; case ARETURN: STACKIN(0, TOBJ); STKPOP(1); INCPC(1); break; case RETURN: INCPC(1); break; case GETSTATIC: if (getField(WORD(pc+1), meth->class, true, &finfo, einfo) == 0) { if (!checkNoClassDefFoundError(einfo)) { goto done_fail; } } /* We must check whether the method * could have been translated in the * getField invokation. It may happen * principally in SecurityManagers. */ if (METHOD_TRANSLATED(meth)) goto done_fail; switch (finfo.signature->data[0]){ case 'I': case 'Z': case 'S': case 'B': case 'C': STKPUSH(1); STACKOUT(0, TINT); break; case 'F': STKPUSH(1); STACKOUT(0, TFLOAT); break; case 'J': STKPUSH(2); STACKOUT(0, TLONG); STACKOUT(1, TVOID); break; case 'D': STKPUSH(2); STACKOUT(0, TDOUBLE); STACKOUT(1, TVOID); break; case '[': case 'L': STKPUSH(1); STACKOUT(0, TOBJ); break; default: KAFFEVM_ABORT(); break; } INCPC(3); break; case PUTSTATIC: if (getField(WORD(pc+1), meth->class, true, &finfo, einfo) == 0) { if (!checkNoClassDefFoundError(einfo)) { goto done_fail; } } if (METHOD_TRANSLATED(meth)) goto done_fail; switch (finfo.signature->data[0]){ case 'I': case 'Z': case 'S': case 'B': case 'C': STACKIN(0, TINT); STKPOP(1); break; case 'F': STACKIN(0, TFLOAT); STKPOP(1); break; case 'J': STACKIN(0, TLONG); STACKIN(1, TVOID); STKPOP(2); break; case 'D': STACKIN(0, TDOUBLE); STACKIN(1, TVOID); STKPOP(2); break; case '[': case 'L': STACKIN(0, TOBJ); STKPOP(1); break; default: KAFFEVM_ABORT(); break; } INCPC(3); break; case GETFIELD: if (getField(WORD(pc+1), meth->class, false, &finfo, einfo) == 0) { goto done_fail; } if (METHOD_TRANSLATED(meth)) goto done_fail; STACKIN(0, TOBJ); if (!FIELD_ISPRIM(finfo.field)) { STACKOUT(0, TOBJ); } else switch (CLASS_PRIM_SIG(FIELD_TYPE(finfo.field))){ case 'I': case 'Z': case 'S': case 'B': case 'C': STACKOUT(0, TINT); break; case 'F': STACKOUT(0, TFLOAT); break; case 'J': STKPUSH(1); STACKOUT(0, TLONG); STACKOUT(1, TVOID); break; case 'D': STKPUSH(1); STACKOUT(0, TDOUBLE); STACKOUT(1, TVOID); break; default: KAFFEVM_ABORT(); break; } INCPC(3); break; case PUTFIELD: if (getField(WORD(pc+1), meth->class, false, &finfo, einfo) == 0) { goto done_fail; } if (METHOD_TRANSLATED(meth)) goto done_fail; if (!FIELD_ISPRIM(finfo.field)) { STACKIN(0, TOBJ); STACKIN(1, TOBJ); STKPOP(2); } else switch (CLASS_PRIM_SIG(FIELD_TYPE(finfo.field))){ case 'I': case 'Z': case 'S': case 'B': case 'C': STACKIN(0, TINT); STACKIN(1, TOBJ); STKPOP(2); break; case 'F': STACKIN(0, TFLOAT); STACKIN(1, TOBJ); STKPOP(2); break; case 'J': STACKIN(0, TLONG); STACKIN(1, TVOID); STACKIN(2, TOBJ); STKPOP(3); break; case 'D': STACKIN(0, TDOUBLE); STACKIN(1, TVOID); STACKIN(2, TOBJ); STKPOP(3); break; default: KAFFEVM_ABORT(); break; } INCPC(3); break; case INVOKEVIRTUAL: case INVOKESPECIAL: if (getMethodSignatureClass(WORD(pc+1), meth->class, true, false, &call, einfo) == false) { if (!checkNoClassDefFoundError(einfo) || call.signature == 0) { goto done_fail; } } if (METHOD_TRANSLATED(meth)) goto done_fail; sig = call.signature->data; assert(sig[0] == '('); sig++; idx = call.in; STACKIN(idx, TOBJ); idx -= 1; while (sig[0] != ')') { switch (sig[0]) { case '[': STACKIN(idx, TOBJ); idx -= 1; while (sig[0] == '[') { sig++; } if (sig[0] == 'L') { while (sig[0] != ';') { sig++; } } sig++; break; case 'L': STACKIN(idx, TOBJ); idx -= 1; while (sig[0] != ';') { sig++; } sig++; break; case 'I': case 'Z': case 'S': case 'B': case 'C': STACKIN(idx, TINT); idx -= 1; sig++; break; case 'J': STACKIN(idx-1, TLONG); STACKIN(idx, TVOID); idx -= 2; sig++; break; case 'F': STACKIN(idx, TFLOAT); idx -= 1; sig++; break; case 'D': STACKIN(idx-1, TDOUBLE); STACKIN(idx, TVOID); idx -= 2; sig++; break; default: assert("Signature character unknown" == 0); } } STKPOP(call.in+1); STKPUSH(call.out); switch (call.rettype) { case '[': case 'L': STACKOUT(0, TOBJ); break; case 'I': case 'Z': case 'S': case 'B': case 'C': STACKOUT(0, TINT); break; case 'J': STACKOUT(0, TLONG); STACKOUT(1, TVOID); break; case 'F': STACKOUT(0, TFLOAT); break; case 'D': STACKOUT(0, TDOUBLE); STACKOUT(1, TVOID); break; case 'V': default: break; } INCPC(3); break; case INVOKEINTERFACE: if (getMethodSignatureClass(WORD(pc+1), meth->class, true, false, &call, einfo) == false) { if (!checkNoClassDefFoundError(einfo) || call.signature == 0) { goto done_fail; } } if (METHOD_TRANSLATED(meth)) goto done_fail; sig = call.signature->data; assert(sig[0] == '('); sig++; idx = call.in; STACKIN(idx, TOBJ); idx -= 1; while (sig[0] != ')') { switch (sig[0]) { case '[': STACKIN(idx, TOBJ); idx -= 1; while (sig[0] == '[') { sig++; } if (sig[0] == 'L') { while (sig[0] != ';') { sig++; } } sig++; break; case 'L': STACKIN(idx, TOBJ); idx -= 1; while (sig[0] != ';') { sig++; } sig++; break; case 'I': case 'Z': case 'S': case 'B': case 'C': STACKIN(idx, TINT); idx -= 1; sig++; break; case 'J': STACKIN(idx-1, TLONG); STACKIN(idx, TVOID); idx -= 2; sig++; break; case 'F': STACKIN(idx, TFLOAT); idx -= 1; sig++; break; case 'D': STACKIN(idx-1, TDOUBLE); STACKIN(idx, TVOID); idx -= 2; sig++; break; default: assert("Signature character unknown" == 0); } } STKPOP(call.in+1); STKPUSH(call.out); switch (call.rettype) { case '[': case 'L': STACKOUT(0, TOBJ); break; case 'I': case 'Z': case 'S': case 'B': case 'C': STACKOUT(0, TINT); break; case 'J': STACKOUT(0, TLONG);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -