/* ** dump.c ** thread and save bytecodes to file */ char* rcs_dump="$Id: dump.c,v 1.12 1996/03/12 20:00:03 lhf Exp $"; #include #include #include "luac.h" static TFunc* lastF=NULL; /* list of functions seen in code */ static int SawVar(int i, int at) { int old=VarLoc(i); VarLoc(i)=at; return old; } static int SawStr(int i, int at) { int old=StrLoc(i); StrLoc(i)=at; return old; } static void ThreadCode(Byte* code, Byte* end) { Byte* p; int i; for (i=0; imarked=at; c.tf->next=NULL; /* TODO: remove? */ lastF=lastF->next=c.tf; break; } case PUSHGLOBAL: case STOREGLOBAL: { CodeWord c; p++; get_word(c,p); c.w=SawVar(c.w,at); p[-2]=c.m.c1; p[-1]=c.m.c2; break; } case STORERECORD: { int n=*++p; p++; while (n--) { CodeWord c; at=p-code; get_word(c,p); c.w=SawStr(c.w,at); p[-2]=c.m.c1; p[-1]=c.m.c2; } break; } default: fprintf(stderr,"luac: cannot happen: opcode=%d",*p); exit(1); break; } } } static void DumpWord(int i, FILE* D) { Word w=i; fwrite(&w,sizeof(w),1,D); } static void DumpBlock(char* b, int size, FILE* D) { fwrite(b,size,1,D); } static void DumpSize(int i, FILE* D) { Word lo=i&0x0FFFF; Word hi=(i>>16)&0x0FFFF; fwrite(&hi,sizeof(hi),1,D); fwrite(&lo,sizeof(lo),1,D); if (hi!=0) fprintf(stderr, "luac: warning: code too long for 16-bit machines (%d bytes)\n",i); } 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 DumpStrings(FILE* D) { int i; for (i=0; icode,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); } void DumpHeader(FILE* D) { Word w=TEST_WORD; float f=TEST_FLOAT; fputc(ID_CHUNK,D); fputs(SIGNATURE,D); fputc(VERSION,D); fwrite(&w,sizeof(w),1,D); fwrite(&f,sizeof(f),1,D); }