Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void CVM(lua_State *L, int rL, int nexeccalls) {
- LClosure* cl;
- StkId base;
- TValue* k;
- Proto* lp;
- const Instruction* pc;
- reentry:
- pc = L->savedpc;
- cl = &clvalue(L->ci->func)->l;
- lp = cl->p;
- base = RBase(rL);
- k = (TValue*)rluaM_malloc(rL, 16 * lp->sizek);
- for (int i = 0; i < lp->sizek; i++) {
- TValue* L_K = &lp->k[i];
- TValue* RK = &k[i];
- switch (L_K->tt)
- {
- case LUA_TNIL:
- RK->tt = RLUA_TNIL;
- cout << "k(" << i << "): " << "NIL" << endl;
- break;
- case LUA_TBOOLEAN:
- RK->value.b = L_K->value.b;
- RK->tt = RLUA_TBOOLEAN;
- cout << "k(" << i << ") BOOLEAN: " << L_K->value.b << endl;
- break;
- case LUA_TNUMBER:
- RK->value.n = xor_number(L_K->value.n);
- RK->tt = RLUA_TNUMBER;
- cout << "k(" << i << ") NUMBER: " << L_K->value.n << endl;
- break;
- case LUA_TSTRING: {
- const char* Str = getstr((TString*)L_K->value.gc);
- RK->value.p = rluaS_new(rL, Str);
- RK->tt = RLUA_TSTRING;
- cout << "k(" << i << ") STRING: " << Str << endl;
- break;
- }
- default:
- break;
- }
- }
- for (;;) {
- const Instruction i = *pc++;
- TValue* ra = RA(i);
- printf("OPCODE: %s\n", luaP_opnames[GET_OPCODE(i)]);
- switch (GET_OPCODE(i))
- {
- case OP_MOVE: {
- r_setobj(ra, RB(i));
- continue;
- }
- case OP_LOADK: {
- r_setobj(ra, KBx(i));
- continue;
- }
- case OP_LOADBOOL: {
- setbvalue(ra, GETARG_B(i));
- if (GETARG_C(i)) pc++; // skip next instruction (if C)
- continue;
- }
- case OP_LOADNIL: {
- TValue* rb = RB(i);
- do {
- setnilvalue(rb--);
- } while (rb >= ra);
- continue;
- }
- case OP_GETUPVAL: {
- continue;
- }
- case OP_GETGLOBAL: {
- TValue* rb = KBx(i);
- if (rb->tt == RLUA_TSTRING)
- rluaV_gettable(rL, reinterpret_cast<TValue*>(rL + 64), rb, ra, 1);
- continue;
- }
- case OP_GETTABLE: {
- rluaV_gettable(rL, RB(i), RKC(i), ra, 1);
- continue;
- }
- case OP_SETGLOBAL: {
- TValue* rb = KBx(i);
- if (rb->tt == RLUA_TSTRING)
- rluaV_settable(rL, reinterpret_cast<TValue*>(rL + 64), rb, ra);
- continue;
- }
- case OP_SETTABLE: {
- rluaV_settable(rL, ra, RKB(i), RKC(i));
- continue;
- }
- case OP_NEWTABLE: {
- continue;
- }
- case OP_SELF: {
- StkId rb = RB(i);
- r_setobj((ra+1), rb);
- rluaV_gettable(rL, rb, RKC(i), ra, 1);
- continue;
- }
- case OP_ADD: {
- TValue* RB = RB(rL);
- TValue* RC = RC(rL);
- if (RB->tt == RLUA_TNUMBER && RC->tt == RLUA_TNUMBER) {
- ra->tt = RLUA_TNUMBER;
- ra->value.n = xor_number(xor_number(RB->value.n) + xor_number(RC->value.n));
- }
- else rlua_arith(rL, ra, RB, RC, R_TM_ADD);
- continue;
- }
- case OP_SUB: {
- TValue* RB = RB(rL);
- TValue* RC = RC(rL);
- if (RB->tt == RLUA_TNUMBER && RC->tt == RLUA_TNUMBER) {
- ra->tt = RLUA_TNUMBER;
- ra->value.n = xor_number(xor_number(RB->value.n) - xor_number(RC->value.n));
- }
- else rlua_arith(rL, ra, RB, RC, R_TM_SUB);
- continue;
- }
- case OP_MUL: {
- TValue* RB = RB(rL);
- TValue* RC = RC(rL);
- if (RB->tt == RLUA_TNUMBER && RC->tt == RLUA_TNUMBER) {
- ra->tt = RLUA_TNUMBER;
- ra->value.n = xor_number(xor_number(RB->value.n) * xor_number(RC->value.n));
- }
- else rlua_arith(rL, ra, RB, RC, R_TM_MUL);
- continue;
- }
- case OP_DIV: {
- TValue* RB = RB(rL);
- TValue* RC = RC(rL);
- if (RB->tt == RLUA_TNUMBER && RC->tt == RLUA_TNUMBER) {
- ra->tt = RLUA_TNUMBER;
- ra->value.n = xor_number(xor_number(RB->value.n) / xor_number(RC->value.n));
- }
- else rlua_arith(rL, ra, RB, RC, R_TM_DIV);
- continue;
- }
- case OP_MOD: {
- TValue* RB = RB(rL);
- TValue* RC = RC(rL);
- if (RB->tt == RLUA_TNUMBER && RC->tt == RLUA_TNUMBER) {
- double nb = xor_number(RB->value.n), nc = xor_number(RC->value.n);
- ra->tt = RLUA_TNUMBER;
- ra->value.n = xor_number((nb - floor(nb / nc) * nc));
- }
- else rlua_arith(rL, ra, RB, RC, R_TM_MOD);
- continue;
- }
- case OP_POW: {
- TValue* RB = RB(rL);
- TValue* RC = RC(rL);
- if (RB->tt == RLUA_TNUMBER && RC->tt == RLUA_TNUMBER) {
- ra->tt = RLUA_TNUMBER;
- ra->value.n = xor_number(pow(xor_number(RB->value.n), xor_number(RC->value.n)));
- }
- else rlua_arith(rL, ra, RB, RC, R_TM_POW);
- continue;
- }
- case OP_UNM: {
- TValue* RB = RB(rL);
- TValue* RC = RC(rL);
- if (RB->tt == RLUA_TNUMBER && RC->tt == RLUA_TNUMBER) {
- ra->tt = RLUA_TNUMBER;
- ra->value.n = xor_number(-(xor_number(RB->value.n)));
- }
- else rlua_arith(rL, ra, RB, RC, R_TM_UNM);
- continue;
- }
- case OP_NOT: {
- int res = l_isfalse(RB(i));
- setbvalue(ra, res);
- continue;
- }
- case OP_LEN: {
- continue;
- }
- case OP_CONCAT: {
- continue;
- }
- case OP_EQ: {
- continue;
- }
- case OP_LT: {
- continue;
- }
- case OP_LE: {
- continue;
- }
- case OP_TEST: {
- if (l_isfalse(ra) != GETARG_C(i))
- dojump(L, pc, GETARG_sBx(*pc));
- pc++;
- continue;
- }
- case OP_TESTSET: {
- TValue* rb = RB(i);
- if (l_isfalse(rb) != GETARG_C(i)) {
- r_setobj(ra, rb);
- dojump(L, pc, GETARG_sBx(*pc));
- }
- pc++;
- continue;
- }
- case OP_CALL: {
- int b = GETARG_B(i);
- int nresults = GETARG_C(i) - 1;
- if (b != 0) RTop(rL) = ra + b; // else previous instruction set top
- switch (rluaD_precall(rL, ra, nresults)) {
- case PCRLUA: {
- nexeccalls++;
- goto reentry; // restart luaV_execute over new Lua function
- }
- }
- if (nresults >= 0) *RTop(rL) = **(TValue * *)(rL + 8); // outdated
- base = RBase(rL);
- continue;
- }
- case OP_TAILCALL: {
- continue;
- }
- case OP_RETURN:
- return;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement