rlm@1: /* rlm@1: ** $Id: print.c,v 1.55a 2006/05/31 13:30:05 lhf Exp $ rlm@1: ** print bytecodes rlm@1: ** See Copyright Notice in lua.h rlm@1: */ rlm@1: rlm@1: #include rlm@1: #include rlm@1: rlm@1: #define luac_c rlm@1: #define LUA_CORE rlm@1: rlm@1: #include "ldebug.h" rlm@1: #include "lobject.h" rlm@1: #include "lopcodes.h" rlm@1: #include "lundump.h" rlm@1: rlm@1: #define PrintFunction luaU_print rlm@1: rlm@1: #define Sizeof(x) ((int)sizeof(x)) rlm@1: #define VOID(p) ((const void*)(p)) rlm@1: rlm@1: static void PrintString(const TString* ts) rlm@1: { rlm@1: const char* s=getstr(ts); rlm@1: size_t i,n=ts->tsv.len; rlm@1: putchar('"'); rlm@1: for (i=0; ik[i]; rlm@1: switch (ttype(o)) rlm@1: { rlm@1: case LUA_TNIL: rlm@1: printf("nil"); rlm@1: break; rlm@1: case LUA_TBOOLEAN: rlm@1: printf(bvalue(o) ? "true" : "false"); rlm@1: break; rlm@1: case LUA_TNUMBER: rlm@1: printf(LUA_NUMBER_FMT,nvalue(o)); rlm@1: break; rlm@1: case LUA_TSTRING: rlm@1: PrintString(rawtsvalue(o)); rlm@1: break; rlm@1: default: /* cannot happen */ rlm@1: printf("? type=%d",ttype(o)); rlm@1: break; rlm@1: } rlm@1: } rlm@1: rlm@1: static void PrintCode(const Proto* f) rlm@1: { rlm@1: const Instruction* code=f->code; rlm@1: int pc,n=f->sizecode; rlm@1: for (pc=0; pc0) printf("[%d]\t",line); else printf("[-]\t"); rlm@1: printf("%-9s\t",luaP_opnames[o]); rlm@1: switch (getOpMode(o)) rlm@1: { rlm@1: case iABC: rlm@1: printf("%d",a); rlm@1: if (getBMode(o)!=OpArgN) printf(" %d",ISK(b) ? (-1-INDEXK(b)) : b); rlm@1: if (getCMode(o)!=OpArgN) printf(" %d",ISK(c) ? (-1-INDEXK(c)) : c); rlm@1: break; rlm@1: case iABx: rlm@1: if (getBMode(o)==OpArgK) printf("%d %d",a,-1-bx); else printf("%d %d",a,bx); rlm@1: break; rlm@1: case iAsBx: rlm@1: if (o==OP_JMP) printf("%d",sbx); else printf("%d %d",a,sbx); rlm@1: break; rlm@1: } rlm@1: switch (o) rlm@1: { rlm@1: case OP_LOADK: rlm@1: printf("\t; "); PrintConstant(f,bx); rlm@1: break; rlm@1: case OP_GETUPVAL: rlm@1: case OP_SETUPVAL: rlm@1: printf("\t; %s", (f->sizeupvalues>0) ? getstr(f->upvalues[b]) : "-"); rlm@1: break; rlm@1: case OP_GETGLOBAL: rlm@1: case OP_SETGLOBAL: rlm@1: printf("\t; %s",svalue(&f->k[bx])); rlm@1: break; rlm@1: case OP_GETTABLE: rlm@1: case OP_SELF: rlm@1: if (ISK(c)) { printf("\t; "); PrintConstant(f,INDEXK(c)); } rlm@1: break; rlm@1: case OP_SETTABLE: rlm@1: case OP_ADD: rlm@1: case OP_SUB: rlm@1: case OP_MUL: rlm@1: case OP_DIV: rlm@1: case OP_POW: rlm@1: case OP_EQ: rlm@1: case OP_LT: rlm@1: case OP_LE: rlm@1: if (ISK(b) || ISK(c)) rlm@1: { rlm@1: printf("\t; "); rlm@1: if (ISK(b)) PrintConstant(f,INDEXK(b)); else printf("-"); rlm@1: printf(" "); rlm@1: if (ISK(c)) PrintConstant(f,INDEXK(c)); else printf("-"); rlm@1: } rlm@1: break; rlm@1: case OP_JMP: rlm@1: case OP_FORLOOP: rlm@1: case OP_FORPREP: rlm@1: printf("\t; to %d",sbx+pc+2); rlm@1: break; rlm@1: case OP_CLOSURE: rlm@1: printf("\t; %p",VOID(f->p[bx])); rlm@1: break; rlm@1: case OP_SETLIST: rlm@1: if (c==0) printf("\t; %d",(int)code[++pc]); rlm@1: else printf("\t; %d",c); rlm@1: break; rlm@1: default: rlm@1: break; rlm@1: } rlm@1: printf("\n"); rlm@1: } rlm@1: } rlm@1: rlm@1: #define SS(x) (x==1)?"":"s" rlm@1: #define S(x) x,SS(x) rlm@1: rlm@1: static void PrintHeader(const Proto* f) rlm@1: { rlm@1: const char* s=getstr(f->source); rlm@1: if (*s=='@' || *s=='=') rlm@1: s++; rlm@1: else if (*s==LUA_SIGNATURE[0]) rlm@1: s="(bstring)"; rlm@1: else rlm@1: s="(string)"; rlm@1: printf("\n%s <%s:%d,%d> (%d instruction%s, %d bytes at %p)\n", rlm@1: (f->linedefined==0)?"main":"function",s, rlm@1: f->linedefined,f->lastlinedefined, rlm@1: S(f->sizecode),f->sizecode*Sizeof(Instruction),VOID(f)); rlm@1: printf("%d%s param%s, %d slot%s, %d upvalue%s, ", rlm@1: f->numparams,f->is_vararg?"+":"",SS(f->numparams), rlm@1: S(f->maxstacksize),S(f->nups)); rlm@1: printf("%d local%s, %d constant%s, %d function%s\n", rlm@1: S(f->sizelocvars),S(f->sizek),S(f->sizep)); rlm@1: } rlm@1: rlm@1: static void PrintConstants(const Proto* f) rlm@1: { rlm@1: int i,n=f->sizek; rlm@1: printf("constants (%d) for %p:\n",n,VOID(f)); rlm@1: for (i=0; isizelocvars; rlm@1: printf("locals (%d) for %p:\n",n,VOID(f)); rlm@1: for (i=0; ilocvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1); rlm@1: } rlm@1: } rlm@1: rlm@1: static void PrintUpvalues(const Proto* f) rlm@1: { rlm@1: int i,n=f->sizeupvalues; rlm@1: printf("upvalues (%d) for %p:\n",n,VOID(f)); rlm@1: if (f->upvalues==NULL) return; rlm@1: for (i=0; iupvalues[i])); rlm@1: } rlm@1: } rlm@1: rlm@1: void PrintFunction(const Proto* f, int full) rlm@1: { rlm@1: int i,n=f->sizep; rlm@1: PrintHeader(f); rlm@1: PrintCode(f); rlm@1: if (full) rlm@1: { rlm@1: PrintConstants(f); rlm@1: PrintLocals(f); rlm@1: PrintUpvalues(f); rlm@1: } rlm@1: for (i=0; ip[i],full); rlm@1: }