historical/callienaps-nw.git/Rev/RevVM.cpp

89 lines
2.5 KiB
C++
Raw Normal View History

2024-01-16 11:20:27 -06:00
#include "RevVM.hpp"
#include "RevLAPI.hpp"
#include "RevLINT.hpp"
#pragma region RevVM Defines
#define rev_setobj(rL, a, b) *(a) = *(b)
#define rev_setobjs2s setobj
#define rev_setobj2s setobj
#define rev_setbvalue(obj, x) { r_TValue *i_o=(obj); i_o->value.b=(x); i_o->tt=R_LUA_TBOOLEAN; }
#define rev_setnilvalue(obj) ((obj)->tt=R_LUA_TNIL)
#define rev_sethvalue { TValue *i_o=(obj); i_o->value.gc=cast(GCObject *, (x)); i_o->tt=R_LUA_TTABLE; }
#define rev_vmtry(x) { __try{x;} __except(rev_luaV_vmcatch(GetExceptionINformation()){})}
#define runtime_check(L, c) { if (!(c)) break; }
#define RA(i) (base+GETARG_A(i))
/* to be used after possible stack reallocation */
#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i))
#define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i))
#define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \
ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i))
#define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \
ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i))
#define KBx(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, k+GETARG_Bx(i))
#define dojump(L,pc,i) {(pc) += (i); luai_threadyield(L);}
#pragma endregion
typedef TValue r_TValue;
int rev_luaV_vmcatch()
{
printf("[!] An error occured");
return 69;
}
r_Proto* rev_luaV_specproto(lua_State *L, Proto* Specification)
{
r_Proto* rp = rev_luaF_newproto((int)L);
rp->is_vararg = Specification->is_vararg;
rp->maxstacksize = Specification->maxstacksize;
rp->numparams = Specification->numparams;
return rp;
}
void rev_luaV_execute(lua_State *L, int nexeccalls)
{
LClosure *cl;
StkId base;
TValue *k;
const Instruction *pc;
reentry:
pc = L->savedpc;
cl = (LClosure*)L->ci->func->value.gc;
base = L->base;
k = cl->p->k;
for (;;) {
const Instruction i = *pc++;
StkId ra;
ra = RA(i);
switch (GET_OPCODE(i)) {
case OP_MOVE: {
rev_setobjs2s(L, ra, RB(i));
continue;
}
case OP_LOADK: {
rev_setobj2s(L, ra, KBx(i));
continue;
}
case OP_LOADBOOL: {
rev_setbvalue(ra, GETARG_B(i));
if (GETARG_C(i)) pc++; /* skip next instruction (if C) */
continue;
}
case OP_LOADNIL: {
TValue *rb = RB(i);
do {
rev_setnilvalue(rb--);
} while (rb >= ra);
continue;
}
case OP_GETUPVAL: {
int b = GETARG_B(i);
rev_setobj2s(L, ra, cl->upvals[b]->v);
continue;
}
}
}
}