static void PrintDebug(const Proto* f) { int i,n; n=f->sizek; printf("constants (%d) for %p:\n",n,VOID(f)); for (i=0; i<n; i++) { printf("\t%d\t",i+1); PrintConstant(f,i); printf("\n"); } n=f->sizelocvars; printf("locals (%d) for %p:\n",n,VOID(f)); for (i=0; i<n; i++) { printf("\t%d\t%s\t%d\t%d\n", i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); } n=f->sizeupvalues; printf("upvalues (%d) for %p:\n",n,VOID(f)); for (i=0; i<n; i++) { printf("\t%d\t%s\t%d\t%d\n", i,UPVALNAME(i),f->upvalues[i].instack,f->upvalues[i].idx); } }
static void PrintDebug(const LuaProto* f) { int i,n; n=(int)f->constants.size(); printf("constants (%d) for %p:\n",n,VOID(f)); for (i=0; i<n; i++) { printf("\t%d\t",i+1); PrintConstant(f,i); printf("\n"); } n=(int)f->locvars.size(); printf("locals (%d) for %p:\n",n,VOID(f)); for (i=0; i<n; i++) { printf("\t%d\t%s\t%d\t%d\n", i,f->locvars[i].varname->c_str(),f->locvars[i].startpc+1,f->locvars[i].endpc+1); } n=(int)f->upvalues.size(); printf("upvalues (%d) for %p:\n",n,VOID(f)); for (i=0; i<n; i++) { printf("\t%d\t%s\t%d\t%d\n", i,UPVALNAME(i),f->upvalues[i].instack,f->upvalues[i].idx); } }
static int do_getupvalue(lua_State *L) /** getupvalue(f,i) */ { const Proto* f=Pget(L,1); int i=luaL_checkinteger(L,2); if (i<=0 || i>f->sizeupvalues || f->upvalues==NULL) return 0; i--; lua_pushstring(L,UPVALNAME(i)); lua_pushinteger(L,f->upvalues[i].instack); lua_pushinteger(L,f->upvalues[i].idx); return 3; }
static void PrintCode(const Proto* f) { const Instruction* code=f->code; int pc,n=f->sizecode; for (pc=0; pc<n; pc++) { Instruction i=code[pc]; OpCode o=GET_OPCODE(i); int a=GETARG_A(i); int b=GETARG_B(i); int c=GETARG_C(i); int ax=GETARG_Ax(i); int bx=GETARG_Bx(i); int sbx=GETARG_sBx(i); int line=getfuncline(f,pc); printf("\t%d\t",pc+1); if (line>0) printf("[%d]\t",line); else printf("[-]\t"); printf("%-9s\t",luaP_opnames[o]); switch (getOpMode(o)) { case iABC: printf("%d",a); if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (MYK(INDEXK(b))) : b); if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (MYK(INDEXK(c))) : c); break; case iABx: printf("%d",a); if (getBMode(o)==OpArgK) printf(" %d",MYK(bx)); if (getBMode(o)==OpArgU) printf(" %d",bx); break; case iAsBx: printf("%d %d",a,sbx); break; case iAx: printf("%d",MYK(ax)); break; } switch (o) { case OP_LOADK: printf("\t; "); PrintConstant(f,bx); break; case OP_GETUPVAL: case OP_SETUPVAL: printf("\t; %s",UPVALNAME(b)); break; case OP_GETTABUP: printf("\t; %s",UPVALNAME(b)); if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); } break; case OP_SETTABUP: printf("\t; %s",UPVALNAME(a)); if (ISK(b)) { printf(" "); PrintConstant(f,INDEXK(b)); } if (ISK(c)) { printf(" "); PrintConstant(f,INDEXK(c)); } break; case OP_GETTABLE: case OP_SELF: if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); } break; case OP_SETTABLE: case OP_ADD: case OP_SUB: case OP_MUL: case OP_POW: case OP_DIV: case OP_IDIV: case OP_BAND: case OP_BOR: case OP_BXOR: case OP_SHL: case OP_SHR: case OP_EQ: case OP_LT: case OP_LE: if (ISK(b) || ISK(c)) { printf("\t; "); if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-"); printf(" "); if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-"); } break; case OP_JMP: case OP_FORLOOP: case OP_FORPREP: case OP_TFORLOOP: printf("\t; to %d",sbx+pc+2); break; case OP_CLOSURE: printf("\t; %p",VOID(f->p[bx])); break; case OP_SETLIST: if (c==0) printf("\t; %d",(int)code[++pc]); else printf("\t; %d",c); break; case OP_EXTRAARG: printf("\t; "); PrintConstant(f,ax); break; default: break; } printf("\n"); } }
static void PrintCode(const Proto* f) { const Instruction* code=f->code; int pc,n=f->sizecode; for (pc=0; pc<n; pc++) { Instruction i=code[pc]; OpCode o=GET_OPCODE(i); int a=GETARG_A(i); int b=GETARG_B(i); int c=GETARG_C(i); int ax=GETARG_Ax(i); int bx=GETARG_Bx(i); int sb=GETARG_sB(i); int sc=GETARG_sC(i); int sbx=GETARG_sBx(i); int isk=GETARG_k(i); int line=getfuncline(f,pc); printf("\t%d\t",pc+1); if (line>0) printf("[%d]\t",line); else printf("[-]\t"); printf("%-9s\t",luaP_opnames[o]); switch (o) { case OP_MOVE: printf("%d %d",a,b); break; case OP_LOADI: printf("%d %d",a,sbx); break; case OP_LOADF: printf("%d %d",a,sbx); break; case OP_LOADK: printf("%d %d",a,bx); printf("\t; "); PrintConstant(f,bx); break; case OP_LOADKX: printf("%d",a); break; case OP_LOADBOOL: printf("%d %d %d",a,b,c); if (c) printf("\t; to %d",pc+2); break; case OP_LOADNIL: printf("%d %d",a,b); printf("\t; %d out",b+1); break; case OP_GETUPVAL: printf("%d %d",a,b); printf("\t; %s",UPVALNAME(b)); break; case OP_SETUPVAL: printf("%d %d",a,b); printf("\t; %s",UPVALNAME(b)); break; case OP_GETTABUP: printf("%d %d %d",a,b,c); printf("\t; %s",UPVALNAME(b)); printf(" "); PrintConstant(f,c); break; case OP_GETTABLE: printf("%d %d %d",a,b,c); break; case OP_GETI: printf("%d %d %d",a,b,c); break; case OP_GETFIELD: printf("%d %d %d",a,b,c); printf("\t; "); PrintConstant(f,c); break; case OP_SETTABUP: printf("%d %d %d%s",a,b,c, isk ? "k" : ""); printf("\t; %s",UPVALNAME(a)); printf(" "); PrintConstant(f,b); if (isk) { printf(" "); PrintConstant(f,c); } break; case OP_SETTABLE: printf("%d %d %d%s",a,b,c, isk ? "k" : ""); if (isk) { printf("\t; "); PrintConstant(f,c); } break; case OP_SETI: printf("%d %d %d%s",a,b,c, isk ? "k" : ""); if (isk) { printf("\t; "); PrintConstant(f,c); } break; case OP_SETFIELD: printf("%d %d %d%s",a,b,c, isk ? "k" : ""); printf("\t; "); PrintConstant(f,b); if (isk) { printf(" "); PrintConstant(f,c); } break; case OP_NEWTABLE: printf("%d %d %d",a,b,c); break; case OP_SELF: printf("%d %d %d%s",a,b,c, isk ? "k" : ""); if (isk) { printf("\t; "); PrintConstant(f,c); } break; case OP_ADDI: printf("%d %d %d",a,b,sc); break; case OP_SUBI: printf("%d %d %d",a,b,sc); break; case OP_MULI: printf("%d %d %d",a,b,sc); break; case OP_MODI: printf("%d %d %d",a,b,sc); break; case OP_POWI: printf("%d %d %d",a,b,sc); break; case OP_DIVI: printf("%d %d %d",a,b,sc); break; case OP_IDIVI: printf("%d %d %d",a,b,sc); break; case OP_BANDK: printf("%d %d %d",a,b,c); printf("\t; "); PrintConstant(f,c); break; case OP_BORK: printf("%d %d %d",a,b,c); printf("\t; "); PrintConstant(f,c); break; case OP_BXORK: printf("%d %d %d",a,b,c); printf("\t; "); PrintConstant(f,c); break; case OP_SHRI: printf("%d %d %d",a,b,c); break; case OP_SHLI: printf("%d %d %d",a,b,c); break; case OP_ADD: printf("%d %d %d",a,b,c); break; case OP_SUB: printf("%d %d %d",a,b,c); break; case OP_MUL: printf("%d %d %d",a,b,c); break; case OP_MOD: printf("%d %d %d",a,b,c); break; case OP_POW: printf("%d %d %d",a,b,c); break; case OP_DIV: printf("%d %d %d",a,b,c); break; case OP_IDIV: printf("%d %d %d",a,b,c); break; case OP_BAND: printf("%d %d %d",a,b,c); break; case OP_BOR: printf("%d %d %d",a,b,c); break; case OP_BXOR: printf("%d %d %d",a,b,c); break; case OP_SHL: printf("%d %d %d",a,b,c); break; case OP_SHR: printf("%d %d %d",a,b,c); break; case OP_UNM: printf("%d %d",a,b); break; case OP_BNOT: printf("%d %d",a,b); break; case OP_NOT: printf("%d %d",a,b); break; case OP_LEN: printf("%d %d",a,b); break; case OP_CONCAT: printf("%d %d",a,b); break; case OP_CLOSE: printf("%d",a); break; case OP_JMP: printf("%d",GETARG_sJ(i)); printf("\t; to %d",GETARG_sJ(i)+pc+2); break; case OP_EQ: printf("%d %d %d",a,b,isk); break; case OP_LT: printf("%d %d %d",a,b,isk); break; case OP_LE: printf("%d %d %d",a,b,isk); break; case OP_EQK: printf("%d %d %d",a,b,isk); printf("\t; "); PrintConstant(f,b); break; case OP_EQI: printf("%d %d %d",a,sb,isk); break; case OP_LTI: printf("%d %d %d",a,sb,isk); break; case OP_LEI: printf("%d %d %d",a,sb,isk); break; case OP_GTI: printf("%d %d %d",a,sb,isk); break; case OP_GEI: printf("%d %d %d",a,sb,isk); break; case OP_TEST: printf("%d %d",a,isk); break; case OP_TESTSET: printf("%d %d %d",a,b,isk); break; case OP_CALL: printf("%d %d %d",a,b,c); printf("\t; "); if (b==0) printf("all in "); else printf("%d in ",b-1); if (c==0) printf("all out"); else printf("%d out",c-1); break; case OP_TAILCALL: printf("%d %d %d",a,b,c); printf("\t; %d in",b-1); break; case OP_RETURN: printf("%d %d %d",a,b,c); printf("\t; "); if (b==0) printf("all out"); else printf("%d out",b-1); break; case OP_RETURN0: break; case OP_RETURN1: printf("%d",a); break; case OP_FORLOOP1: printf("%d %d",a,bx); printf("\t; to %d",pc-bx+2); break; case OP_FORPREP1: printf("%d %d",a,bx); printf("\t; to %d",pc+bx+2); break; case OP_FORLOOP: printf("%d %d",a,bx); printf("\t; to %d",pc-bx+2); break; case OP_FORPREP: printf("%d %d",a,bx); printf("\t; to %d",pc+bx+2); break; case OP_TFORCALL: printf("%d %d",a,c); break; case OP_TFORLOOP: printf("%d %d",a,bx); printf("\t; to %d",pc-bx+2); break; case OP_SETLIST: printf("%d %d %d",a,b,c); break; case OP_CLOSURE: printf("%d %d",a,bx); printf("\t; %p",VOID(f->p[bx])); break; case OP_VARARG: printf("%d %d",a,c); printf("\t; "); if (c==0) printf("all out"); else printf("%d out",c-1); break; case OP_PREPVARARG: printf("%d",a); break; case OP_EXTRAARG: printf("%d",ax); printf("\t; "); PrintConstant(f,ax); break; } printf("\n"); } }