Imported from ../lua-3.0.tar.gz.
[lua.git] / src / luac / dump.c
blob73839f38387ac8f58855a35dc0383003dc8da04c
1 /*
2 ** dump.c
3 ** thread and save bytecodes to file
4 */
6 char* rcs_dump="$Id: dump.c,v 1.20 1997/06/19 14:56:04 lhf Exp $";
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include "luac.h"
13 static int SawVar(int i, int at)
15 int old=VarLoc(i);
16 VarLoc(i)=at;
17 return old;
20 static int SawStr(int i, int at)
22 int old=StrLoc(i);
23 StrLoc(i)=at;
24 return old;
27 static void ThreadCode(Byte* code, Byte* end)
29 Byte* p;
30 int i;
31 for (i=0; i<lua_ntable; i++) VarLoc(i)=0;
32 for (i=0; i<lua_nconstant; i++) StrLoc(i)=0;
33 for (p=code; p!=end;)
35 int op=*p;
36 int at=p-code+1;
37 switch (op)
39 case PUSHNIL:
40 case PUSH0:
41 case PUSH1:
42 case PUSH2:
43 case PUSHLOCAL0:
44 case PUSHLOCAL1:
45 case PUSHLOCAL2:
46 case PUSHLOCAL3:
47 case PUSHLOCAL4:
48 case PUSHLOCAL5:
49 case PUSHLOCAL6:
50 case PUSHLOCAL7:
51 case PUSHLOCAL8:
52 case PUSHLOCAL9:
53 case PUSHINDEXED:
54 case STORELOCAL0:
55 case STORELOCAL1:
56 case STORELOCAL2:
57 case STORELOCAL3:
58 case STORELOCAL4:
59 case STORELOCAL5:
60 case STORELOCAL6:
61 case STORELOCAL7:
62 case STORELOCAL8:
63 case STORELOCAL9:
64 case STOREINDEXED0:
65 case ADJUST0:
66 case EQOP:
67 case LTOP:
68 case LEOP:
69 case GTOP:
70 case GEOP:
71 case ADDOP:
72 case SUBOP:
73 case MULTOP:
74 case DIVOP:
75 case POWOP:
76 case CONCOP:
77 case MINUSOP:
78 case NOTOP:
79 case POP:
80 case RETCODE0:
81 p++;
82 break;
83 case PUSHBYTE:
84 case PUSHLOCAL:
85 case STORELOCAL:
86 case STOREINDEXED:
87 case STORELIST0:
88 case ADJUST:
89 case RETCODE:
90 case VARARGS:
91 case STOREMAP:
92 p+=2;
93 break;
94 case PUSHWORD:
95 case CREATEARRAY:
96 case ONTJMP:
97 case ONFJMP:
98 case JMP:
99 case UPJMP:
100 case IFFJMP:
101 case IFFUPJMP:
102 case SETLINE:
103 case STORELIST:
104 case CALLFUNC:
105 p+=3;
106 break;
107 case PUSHFLOAT:
108 p+=5; /* assumes sizeof(float)==4 */
109 break;
110 case PUSHFUNCTION:
111 p+=sizeof(TFunc*)+1;
112 break;
113 case PUSHSTRING:
114 case PUSHSELF:
116 Word w;
117 p++;
118 get_word(w,p);
119 w=SawStr(w,at);
120 memcpy(p-2,&w,sizeof(w));
121 break;
123 case PUSHGLOBAL:
124 case STOREGLOBAL:
126 Word w;
127 p++;
128 get_word(w,p);
129 w=SawVar(w,at);
130 memcpy(p-2,&w,sizeof(w));
131 break;
133 case STORERECORD:
135 int n=*++p;
136 p++;
137 while (n--)
139 Word w;
140 at=p-code;
141 get_word(w,p);
142 w=SawStr(w,at);
143 memcpy(p-2,&w,sizeof(w));
145 break;
147 default: /* cannot happen */
148 fprintf(stderr,"luac: bad opcode %d at %d\n",*p,(int)(p-code));
149 exit(1);
150 break;
155 static void DumpWord(int i, FILE* D)
157 Word w=i;
158 fwrite(&w,sizeof(w),1,D);
161 static void DumpBlock(void* b, int size, FILE* D)
163 fwrite(b,size,1,D);
166 static void DumpSize(int i, FILE* D)
168 Word lo=i&0x0FFFF;
169 Word hi=(i>>16)&0x0FFFF;
170 fwrite(&hi,sizeof(hi),1,D);
171 fwrite(&lo,sizeof(lo),1,D);
172 if (hi!=0)
173 fprintf(stderr,
174 "luac: warning: code too long for 16-bit machines (%d bytes)\n",i);
177 static void DumpString(char* s, FILE* D)
179 int n=strlen(s)+1;
180 if ((Word)n != n)
182 fprintf(stderr,"luac: string too long (%d bytes): \"%.32s...\"\n",n,s);
183 exit(1);
185 DumpWord(n,D);
186 DumpBlock(s,n,D);
189 static void DumpStrings(FILE* D)
191 int i;
192 for (i=0; i<lua_ntable; i++)
194 if (VarLoc(i)!=0)
196 fputc(ID_VAR,D);
197 DumpWord(VarLoc(i),D);
198 DumpString(VarStr(i),D);
200 VarLoc(i)=i;
202 for (i=0; i<lua_nconstant; i++)
204 if (StrLoc(i)!=0)
206 fputc(ID_STR,D);
207 DumpWord(StrLoc(i),D);
208 DumpString(StrStr(i),D);
210 StrLoc(i)=i;
214 void DumpFunction(TFunc* tf, FILE* D)
216 ThreadCode(tf->code,tf->code+tf->size);
217 fputc(ID_FUN,D);
218 DumpSize(tf->size,D);
219 DumpWord(tf->lineDefined,D);
220 if (IsMain(tf))
221 DumpString(tf->fileName,D);
222 else
223 DumpWord(tf->marked,D);
224 DumpBlock(tf->code,tf->size,D);
225 DumpStrings(D);
228 void DumpHeader(FILE* D)
230 Word w=TEST_WORD;
231 float f=TEST_FLOAT;
232 fputc(ID_CHUNK,D);
233 fputs(SIGNATURE,D);
234 fputc(VERSION,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);