3 ** thread and save bytecodes to file
6 char* rcs_dump
="$Id: dump.c,v 1.20 1997/06/19 14:56:04 lhf Exp $";
13 static int SawVar(int i
, int at
)
20 static int SawStr(int i
, int at
)
27 static void ThreadCode(Byte
* code
, Byte
* end
)
31 for (i
=0; i
<lua_ntable
; i
++) VarLoc(i
)=0;
32 for (i
=0; i
<lua_nconstant
; i
++) StrLoc(i
)=0;
108 p
+=5; /* assumes sizeof(float)==4 */
120 memcpy(p
-2,&w
,sizeof(w
));
130 memcpy(p
-2,&w
,sizeof(w
));
143 memcpy(p
-2,&w
,sizeof(w
));
147 default: /* cannot happen */
148 fprintf(stderr
,"luac: bad opcode %d at %d\n",*p
,(int)(p
-code
));
155 static void DumpWord(int i
, FILE* D
)
158 fwrite(&w
,sizeof(w
),1,D
);
161 static void DumpBlock(void* b
, int size
, FILE* D
)
166 static void DumpSize(int i
, FILE* D
)
169 Word hi
=(i
>>16)&0x0FFFF;
170 fwrite(&hi
,sizeof(hi
),1,D
);
171 fwrite(&lo
,sizeof(lo
),1,D
);
174 "luac: warning: code too long for 16-bit machines (%d bytes)\n",i
);
177 static void DumpString(char* s
, FILE* D
)
182 fprintf(stderr
,"luac: string too long (%d bytes): \"%.32s...\"\n",n
,s
);
189 static void DumpStrings(FILE* D
)
192 for (i
=0; i
<lua_ntable
; i
++)
197 DumpWord(VarLoc(i
),D
);
198 DumpString(VarStr(i
),D
);
202 for (i
=0; i
<lua_nconstant
; i
++)
207 DumpWord(StrLoc(i
),D
);
208 DumpString(StrStr(i
),D
);
214 void DumpFunction(TFunc
* tf
, FILE* D
)
216 ThreadCode(tf
->code
,tf
->code
+tf
->size
);
218 DumpSize(tf
->size
,D
);
219 DumpWord(tf
->lineDefined
,D
);
221 DumpString(tf
->fileName
,D
);
223 DumpWord(tf
->marked
,D
);
224 DumpBlock(tf
->code
,tf
->size
,D
);
228 void DumpHeader(FILE* D
)
235 fputc(sizeof(Word
),D
);
236 fputc(sizeof(float),D
);
237 fputc(sizeof(TFunc
*),D
);
238 fwrite(&w
,sizeof(w
),1,D
);
239 fwrite(&f
,sizeof(f
),1,D
);