void VMDisasm(FILE *out, const VMOP *code, int codesize, const VMScriptFunction *func) { VMFunction *callfunc; const char *callname; const char *name; int col; int mode; int a; bool cmp; char cmpname[8]; for (int i = 0; i < codesize; ++i) { name = OpInfo[code[i].op].Name; mode = OpInfo[code[i].op].Mode; a = code[i].a; cmp = (mode & MODE_ATYPE) == MODE_ACMP; // String comparison encodes everything in a single instruction. if (code[i].op == OP_CMPS) { switch (a & CMP_METHOD_MASK) { case CMP_EQ: name = "beq"; break; case CMP_LT: name = "blt"; break; case CMP_LE: name = "ble"; break; } mode = MODE_AIMMZ; mode |= (a & CMP_BK) ? MODE_BKS : MODE_BS; mode |= (a & CMP_CK) ? MODE_CKS : MODE_CS; a &= CMP_CHECK | CMP_APPROX; cmp = true; } if (cmp) { // Comparison instruction. Modify name for inverted test. if (!(a & CMP_CHECK)) { strcpy(cmpname, name); if (name[1] == 'e') { // eq -> ne cmpname[1] = 'n', cmpname[2] = 'e'; } else if (name[2] == 't') { // lt -> ge cmpname[1] = 'g', cmpname[2] = 'e'; } else { // le -> gt cmpname[1] = 'g', cmpname[2] = 't'; } name = cmpname; } } printf_wrapper(out, "%08x: %02x%02x%02x%02x %-8s", i << 2, code[i].op, code[i].a, code[i].b, code[i].c, name); col = 0; switch (code[i].op) { case OP_JMP: case OP_TRY: col = printf_wrapper(out, "%08x", (i + 1 + code[i].i24) << 2); break; case OP_PARAMI: col = printf_wrapper(out, "%d", code[i].i24); break; case OP_CALL_K: case OP_TAIL_K: callfunc = (VMFunction *)func->KonstA[code[i].a].o; callname = callfunc->Name != NAME_None ? callfunc->Name : "[anonfunc]"; col = printf_wrapper(out, "%.23s,%d", callname, code[i].b); if (code[i].op == OP_CALL_K) { col += printf_wrapper(out, ",%d", code[i].c); } break; case OP_RET: if (code[i].b != REGT_NIL) { if (a == RET_FINAL) { col = print_reg(out, 0, code[i].i16u, MODE_PARAM, 16, func); } else { col = print_reg(out, 0, a & ~RET_FINAL, (mode & MODE_ATYPE) >> MODE_ASHIFT, 24, func); col += print_reg(out, col, code[i].i16u, MODE_PARAM, 16, func); if (a & RET_FINAL) { col += printf_wrapper(out, " [final]"); } } } break; case OP_RETI: if (a == RET_FINAL) { col = printf_wrapper(out, "%d", code[i].i16); } else { col = print_reg(out, 0, a & ~RET_FINAL, (mode & MODE_ATYPE) >> MODE_ASHIFT, 24, func); col += print_reg(out, col, code[i].i16, MODE_IMMS, 16, func); if (a & RET_FINAL) { col += printf_wrapper(out, " [final]"); } } break; case OP_FLOP: col = printf_wrapper(out, "f%d,f%d,%d", code[i].a, code[i].b, code[i].c); if (code[i].c < countof(FlopNames)) { col += printf_wrapper(out, " [%s]", FlopNames[code[i].c]); } break; default: if ((mode & MODE_BCTYPE) == MODE_BCCAST) { switch (code[i].c) { case CAST_I2F: mode = MODE_AF | MODE_BI | MODE_CUNUSED; break; case CAST_I2S: mode = MODE_AS | MODE_BI | MODE_CUNUSED; break; case CAST_F2I: mode = MODE_AI | MODE_BF | MODE_CUNUSED; break; case CAST_F2S: mode = MODE_AS | MODE_BF | MODE_CUNUSED; break; case CAST_P2S: mode = MODE_AS | MODE_BP | MODE_CUNUSED; break; case CAST_S2I: mode = MODE_AI | MODE_BS | MODE_CUNUSED; break; case CAST_S2F: mode = MODE_AF | MODE_BS | MODE_CUNUSED; break; default: mode = MODE_AX | MODE_BX | MODE_CIMMZ; break; } } col = print_reg(out, 0, a, (mode & MODE_ATYPE) >> MODE_ASHIFT, 24, func); if ((mode & MODE_BCTYPE) == MODE_BCTHROW) { if (code[i].a == 0) { mode = (MODE_BP | MODE_CUNUSED); } else if (code[i].a == 1) { mode = (MODE_BKP | MODE_CUNUSED); } else { mode = (MODE_BCJOINT | MODE_BCIMMS); } } else if ((mode & MODE_BCTYPE) == MODE_BCCATCH) { switch (code[i].a) { case 0: mode = MODE_BUNUSED | MODE_CUNUSED; break; case 1: mode = MODE_BUNUSED | MODE_CP; break; case 2: mode = MODE_BP | MODE_CP; break; case 3: mode = MODE_BKP | MODE_CP; break; default: mode = MODE_BIMMZ | MODE_CIMMZ; break; } } if ((mode & (MODE_BTYPE | MODE_CTYPE)) == MODE_BCJOINT) { col += print_reg(out, col, code[i].i16u, (mode & MODE_BCTYPE) >> MODE_BCSHIFT, 16, func); } else { col += print_reg(out, col, code[i].b, (mode & MODE_BTYPE) >> MODE_BSHIFT, 24, func); col += print_reg(out, col, code[i].c, (mode & MODE_CTYPE) >> MODE_CSHIFT, 24, func); } break; }
int function1(char *temp_ptr,char *etype) { printf_wrapper(temp_ptr); //printf("\n Value of temp_buff is %s and etype is %s\n",puts(temp_ptr),puts(etype)); return 0; }
void VMDumpConstants(FILE *out, const VMScriptFunction *func) { char tmp[21]; int i, j, k, kk; if (func->KonstD != NULL && func->NumKonstD != 0) { printf_wrapper(out, "\nConstant integers:\n"); kk = (func->NumKonstD + 3) / 4; for (i = 0; i < kk; ++i) { for (j = 0, k = i; j < 4 && k < func->NumKonstD; j++, k += kk) { mysnprintf(tmp, countof(tmp), "%3d. %d", k, func->KonstD[k]); printf_wrapper(out, "%-20s", tmp); } printf_wrapper(out, "\n"); } } if (func->KonstF != NULL && func->NumKonstF != 0) { printf_wrapper(out, "\nConstant floats:\n"); kk = (func->NumKonstF + 3) / 4; for (i = 0; i < kk; ++i) { for (j = 0, k = i; j < 4 && k < func->NumKonstF; j++, k += kk) { mysnprintf(tmp, countof(tmp), "%3d. %.16f", k, func->KonstF[k]); printf_wrapper(out, "%-20s", tmp); } printf_wrapper(out, "\n"); } } if (func->KonstA != NULL && func->NumKonstA != 0) { printf_wrapper(out, "\nConstant addresses:\n"); kk = (func->NumKonstA + 3) / 4; for (i = 0; i < kk; ++i) { for (j = 0, k = i; j < 4 && k < func->NumKonstA; j++, k += kk) { mysnprintf(tmp, countof(tmp), "%3d. %p:%d", k, func->KonstA[k].v, func->KonstATags()[k]); printf_wrapper(out, "%-20s", tmp); } printf_wrapper(out, "\n"); } } if (func->KonstS != NULL && func->NumKonstS != 0) { printf_wrapper(out, "\nConstant strings:\n"); for (i = 0; i < func->NumKonstS; ++i) { printf_wrapper(out, "%3d. %s\n", i, func->KonstS[i].GetChars()); } } }