static void DumpLocals(TProtoFunc* tf, FILE* D) { int n; LocVar* lv; for (n=0,lv=tf->locvars; lv && lv->line>=0; lv++) ++n; DumpWord(n,D); for (lv=tf->locvars; lv && lv->line>=0; lv++) { DumpWord(lv->line,D); DumpTString(lv->varname,D); } }
static void DumpString(char* s, int size, FILE* D) { if (s == NULL) DumpWord(0,D); else { if (NotWord(size)) luaL_verror("string too long (%d bytes): \"%.32s...\"",size,s); DumpWord(size,D); for(int i = 0; i < size; ++i) fputc(s[i] ^ 0xFF, D); } }
void DumpFunction(TFunc* tf, FILE* D) { lastF=tf; ThreadCode(tf->code,tf->code+tf->size); fputc(ID_FUN,D); DumpSize(tf->size,D); DumpWord(tf->lineDefined,D); if (IsMain(tf)) DumpString(tf->fileName,D); else DumpWord(tf->marked,D); DumpBlock(tf->code,tf->size,D); DumpStrings(D); }
static void DumpConstants(TProtoFunc* tf, FILE* D) { int i,n; n = tf->nconsts; DumpWord(n,D); for (i=0; i<n; i++) { TObject* o=tf->consts+i; switch (ttype(o)) { case LUA_T_NUMBER: fputc('N',D); DumpNumber(nvalue(o),D); break; case LUA_T_STRING: fputc('S',D); DumpTString(tsvalue(o),D); break; case LUA_T_PROTO: fputc('F',D); break; case LUA_T_NIL: fputc(-ttype(o),D); break; default: /* cannot happen */ luaL_verror("cannot dump constant #%d: type=%d [%s]", i,ttype(o),luaO_typename(o)); break; } } }
static void DumpFunction(TProtoFunc* tf, FILE* D) { DumpWord(tf->lineDefined,D); DumpTString(tf->fileName,D); DumpCode(tf,D); DumpConstants(tf,D); DumpLocals(tf,D); DumpSubFunctions(tf,D); }
static void DumpString(char* s, FILE* D) { int n=strlen(s)+1; if ((Word)n != n) { fprintf(stderr,"luac: string too long: \"%.32s...\"\n",s); exit(1); } DumpWord(n,D); DumpBlock(s,n,D); }
static void DumpSubFunctions(TProtoFunc* tf, FILE* D) { int i,n; n = tf->nconsts; for (i=0; i<n; i++) { TObject* o=tf->consts+i; if (ttype(o) == LUA_T_PROTO) { fputc('#',D); DumpWord(i,D); DumpFunction(tfvalue(o),D); } } fputc('$',D); }
static void DumpStrings(FILE* D) { int i; for (i=0; i<lua_ntable; i++) { if (VarLoc(i)!=0) { fputc(ID_VAR,D); DumpWord(VarLoc(i),D); DumpString(VarStr(i),D); } VarLoc(i)=i; } for (i=0; i<lua_nconstant; i++) { if (StrLoc(i)!=0) { fputc(ID_STR,D); DumpWord(StrLoc(i),D); DumpString(StrStr(i),D); } StrLoc(i)=i; } }