aboutsummaryrefslogtreecommitdiff
path: root/lundump.c
diff options
context:
space:
mode:
Diffstat (limited to 'lundump.c')
-rw-r--r--lundump.c146
1 files changed, 73 insertions, 73 deletions
diff --git a/lundump.c b/lundump.c
index 1fa322f6..17364999 100644
--- a/lundump.c
+++ b/lundump.c
@@ -44,21 +44,21 @@ static l_noret error (LoadState *S, const char *why) {
44 44
45 45
46/* 46/*
47** All high-level loads go through LoadVector; you can change it to 47** All high-level loads go through loadVector; you can change it to
48** adapt to the endianness of the input 48** adapt to the endianness of the input
49*/ 49*/
50#define LoadVector(S,b,n) LoadBlock(S,b,(n)*sizeof((b)[0])) 50#define loadVector(S,b,n) loadBlock(S,b,(n)*sizeof((b)[0]))
51 51
52static void LoadBlock (LoadState *S, void *b, size_t size) { 52static void loadBlock (LoadState *S, void *b, size_t size) {
53 if (luaZ_read(S->Z, b, size) != 0) 53 if (luaZ_read(S->Z, b, size) != 0)
54 error(S, "truncated chunk"); 54 error(S, "truncated chunk");
55} 55}
56 56
57 57
58#define LoadVar(S,x) LoadVector(S,&x,1) 58#define loadVar(S,x) loadVector(S,&x,1)
59 59
60 60
61static lu_byte LoadByte (LoadState *S) { 61static lu_byte loadByte (LoadState *S) {
62 int b = zgetc(S->Z); 62 int b = zgetc(S->Z);
63 if (b == EOZ) 63 if (b == EOZ)
64 error(S, "truncated chunk"); 64 error(S, "truncated chunk");
@@ -66,12 +66,12 @@ static lu_byte LoadByte (LoadState *S) {
66} 66}
67 67
68 68
69static size_t LoadUnsigned (LoadState *S, size_t limit) { 69static size_t loadUnsigned (LoadState *S, size_t limit) {
70 size_t x = 0; 70 size_t x = 0;
71 int b; 71 int b;
72 limit >>= 7; 72 limit >>= 7;
73 do { 73 do {
74 b = LoadByte(S); 74 b = loadByte(S);
75 if (x >= limit) 75 if (x >= limit)
76 error(S, "integer overflow"); 76 error(S, "integer overflow");
77 x = (x << 7) | (b & 0x7f); 77 x = (x << 7) | (b & 0x7f);
@@ -80,45 +80,45 @@ static size_t LoadUnsigned (LoadState *S, size_t limit) {
80} 80}
81 81
82 82
83static size_t LoadSize (LoadState *S) { 83static size_t loadSize (LoadState *S) {
84 return LoadUnsigned(S, ~(size_t)0); 84 return loadUnsigned(S, ~(size_t)0);
85} 85}
86 86
87 87
88static int LoadInt (LoadState *S) { 88static int loadInt (LoadState *S) {
89 return cast_int(LoadUnsigned(S, INT_MAX)); 89 return cast_int(loadUnsigned(S, INT_MAX));
90} 90}
91 91
92 92
93static lua_Number LoadNumber (LoadState *S) { 93static lua_Number loadNumber (LoadState *S) {
94 lua_Number x; 94 lua_Number x;
95 LoadVar(S, x); 95 loadVar(S, x);
96 return x; 96 return x;
97} 97}
98 98
99 99
100static lua_Integer LoadInteger (LoadState *S) { 100static lua_Integer loadInteger (LoadState *S) {
101 lua_Integer x; 101 lua_Integer x;
102 LoadVar(S, x); 102 loadVar(S, x);
103 return x; 103 return x;
104} 104}
105 105
106 106
107/* 107/*
108** Load a nullable string 108** Load a nullable string.
109*/ 109*/
110static TString *LoadStringN (LoadState *S) { 110static TString *loadStringN (LoadState *S) {
111 size_t size = LoadSize(S); 111 size_t size = loadSize(S);
112 if (size == 0) 112 if (size == 0)
113 return NULL; 113 return NULL;
114 else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */ 114 else if (--size <= LUAI_MAXSHORTLEN) { /* short string? */
115 char buff[LUAI_MAXSHORTLEN]; 115 char buff[LUAI_MAXSHORTLEN];
116 LoadVector(S, buff, size); 116 loadVector(S, buff, size);
117 return luaS_newlstr(S->L, buff, size); 117 return luaS_newlstr(S->L, buff, size);
118 } 118 }
119 else { /* long string */ 119 else { /* long string */
120 TString *ts = luaS_createlngstrobj(S->L, size); 120 TString *ts = luaS_createlngstrobj(S->L, size);
121 LoadVector(S, getstr(ts), size); /* load directly in final place */ 121 loadVector(S, getstr(ts), size); /* load directly in final place */
122 return ts; 122 return ts;
123 } 123 }
124} 124}
@@ -127,35 +127,35 @@ static TString *LoadStringN (LoadState *S) {
127/* 127/*
128** Load a non-nullable string. 128** Load a non-nullable string.
129*/ 129*/
130static TString *LoadString (LoadState *S) { 130static TString *loadString (LoadState *S) {
131 TString *st = LoadStringN(S); 131 TString *st = loadStringN(S);
132 if (st == NULL) 132 if (st == NULL)
133 error(S, "bad format for constant string"); 133 error(S, "bad format for constant string");
134 return st; 134 return st;
135} 135}
136 136
137 137
138static void LoadCode (LoadState *S, Proto *f) { 138static void loadCode (LoadState *S, Proto *f) {
139 int n = LoadInt(S); 139 int n = loadInt(S);
140 f->code = luaM_newvectorchecked(S->L, n, Instruction); 140 f->code = luaM_newvectorchecked(S->L, n, Instruction);
141 f->sizecode = n; 141 f->sizecode = n;
142 LoadVector(S, f->code, n); 142 loadVector(S, f->code, n);
143} 143}
144 144
145 145
146static void LoadFunction(LoadState *S, Proto *f, TString *psource); 146static void loadFunction(LoadState *S, Proto *f, TString *psource);
147 147
148 148
149static void LoadConstants (LoadState *S, Proto *f) { 149static void loadConstants (LoadState *S, Proto *f) {
150 int i; 150 int i;
151 int n = LoadInt(S); 151 int n = loadInt(S);
152 f->k = luaM_newvectorchecked(S->L, n, TValue); 152 f->k = luaM_newvectorchecked(S->L, n, TValue);
153 f->sizek = n; 153 f->sizek = n;
154 for (i = 0; i < n; i++) 154 for (i = 0; i < n; i++)
155 setnilvalue(&f->k[i]); 155 setnilvalue(&f->k[i]);
156 for (i = 0; i < n; i++) { 156 for (i = 0; i < n; i++) {
157 TValue *o = &f->k[i]; 157 TValue *o = &f->k[i];
158 int t = LoadByte(S); 158 int t = loadByte(S);
159 switch (t) { 159 switch (t) {
160 case LUA_VNIL: 160 case LUA_VNIL:
161 setnilvalue(o); 161 setnilvalue(o);
@@ -167,14 +167,14 @@ static void LoadConstants (LoadState *S, Proto *f) {
167 setbtvalue(o); 167 setbtvalue(o);
168 break; 168 break;
169 case LUA_VNUMFLT: 169 case LUA_VNUMFLT:
170 setfltvalue(o, LoadNumber(S)); 170 setfltvalue(o, loadNumber(S));
171 break; 171 break;
172 case LUA_VNUMINT: 172 case LUA_VNUMINT:
173 setivalue(o, LoadInteger(S)); 173 setivalue(o, loadInteger(S));
174 break; 174 break;
175 case LUA_VSHRSTR: 175 case LUA_VSHRSTR:
176 case LUA_VLNGSTR: 176 case LUA_VLNGSTR:
177 setsvalue2n(S->L, o, LoadString(S)); 177 setsvalue2n(S->L, o, loadString(S));
178 break; 178 break;
179 default: lua_assert(0); 179 default: lua_assert(0);
180 } 180 }
@@ -182,91 +182,91 @@ static void LoadConstants (LoadState *S, Proto *f) {
182} 182}
183 183
184 184
185static void LoadProtos (LoadState *S, Proto *f) { 185static void loadProtos (LoadState *S, Proto *f) {
186 int i; 186 int i;
187 int n = LoadInt(S); 187 int n = loadInt(S);
188 f->p = luaM_newvectorchecked(S->L, n, Proto *); 188 f->p = luaM_newvectorchecked(S->L, n, Proto *);
189 f->sizep = n; 189 f->sizep = n;
190 for (i = 0; i < n; i++) 190 for (i = 0; i < n; i++)
191 f->p[i] = NULL; 191 f->p[i] = NULL;
192 for (i = 0; i < n; i++) { 192 for (i = 0; i < n; i++) {
193 f->p[i] = luaF_newproto(S->L); 193 f->p[i] = luaF_newproto(S->L);
194 LoadFunction(S, f->p[i], f->source); 194 loadFunction(S, f->p[i], f->source);
195 } 195 }
196} 196}
197 197
198 198
199static void LoadUpvalues (LoadState *S, Proto *f) { 199static void loadUpvalues (LoadState *S, Proto *f) {
200 int i, n; 200 int i, n;
201 n = LoadInt(S); 201 n = loadInt(S);
202 f->upvalues = luaM_newvectorchecked(S->L, n, Upvaldesc); 202 f->upvalues = luaM_newvectorchecked(S->L, n, Upvaldesc);
203 f->sizeupvalues = n; 203 f->sizeupvalues = n;
204 for (i = 0; i < n; i++) { 204 for (i = 0; i < n; i++) {
205 f->upvalues[i].name = NULL; 205 f->upvalues[i].name = NULL;
206 f->upvalues[i].instack = LoadByte(S); 206 f->upvalues[i].instack = loadByte(S);
207 f->upvalues[i].idx = LoadByte(S); 207 f->upvalues[i].idx = loadByte(S);
208 f->upvalues[i].kind = LoadByte(S); 208 f->upvalues[i].kind = loadByte(S);
209 } 209 }
210} 210}
211 211
212 212
213static void LoadDebug (LoadState *S, Proto *f) { 213static void loadDebug (LoadState *S, Proto *f) {
214 int i, n; 214 int i, n;
215 n = LoadInt(S); 215 n = loadInt(S);
216 f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte); 216 f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte);
217 f->sizelineinfo = n; 217 f->sizelineinfo = n;
218 LoadVector(S, f->lineinfo, n); 218 loadVector(S, f->lineinfo, n);
219 n = LoadInt(S); 219 n = loadInt(S);
220 f->abslineinfo = luaM_newvectorchecked(S->L, n, AbsLineInfo); 220 f->abslineinfo = luaM_newvectorchecked(S->L, n, AbsLineInfo);
221 f->sizeabslineinfo = n; 221 f->sizeabslineinfo = n;
222 for (i = 0; i < n; i++) { 222 for (i = 0; i < n; i++) {
223 f->abslineinfo[i].pc = LoadInt(S); 223 f->abslineinfo[i].pc = loadInt(S);
224 f->abslineinfo[i].line = LoadInt(S); 224 f->abslineinfo[i].line = loadInt(S);
225 } 225 }
226 n = LoadInt(S); 226 n = loadInt(S);
227 f->locvars = luaM_newvectorchecked(S->L, n, LocVar); 227 f->locvars = luaM_newvectorchecked(S->L, n, LocVar);
228 f->sizelocvars = n; 228 f->sizelocvars = n;
229 for (i = 0; i < n; i++) 229 for (i = 0; i < n; i++)
230 f->locvars[i].varname = NULL; 230 f->locvars[i].varname = NULL;
231 for (i = 0; i < n; i++) { 231 for (i = 0; i < n; i++) {
232 f->locvars[i].varname = LoadStringN(S); 232 f->locvars[i].varname = loadStringN(S);
233 f->locvars[i].startpc = LoadInt(S); 233 f->locvars[i].startpc = loadInt(S);
234 f->locvars[i].endpc = LoadInt(S); 234 f->locvars[i].endpc = loadInt(S);
235 } 235 }
236 n = LoadInt(S); 236 n = loadInt(S);
237 for (i = 0; i < n; i++) 237 for (i = 0; i < n; i++)
238 f->upvalues[i].name = LoadStringN(S); 238 f->upvalues[i].name = loadStringN(S);
239} 239}
240 240
241 241
242static void LoadFunction (LoadState *S, Proto *f, TString *psource) { 242static void loadFunction (LoadState *S, Proto *f, TString *psource) {
243 f->source = LoadStringN(S); 243 f->source = loadStringN(S);
244 if (f->source == NULL) /* no source in dump? */ 244 if (f->source == NULL) /* no source in dump? */
245 f->source = psource; /* reuse parent's source */ 245 f->source = psource; /* reuse parent's source */
246 f->linedefined = LoadInt(S); 246 f->linedefined = loadInt(S);
247 f->lastlinedefined = LoadInt(S); 247 f->lastlinedefined = loadInt(S);
248 f->numparams = LoadByte(S); 248 f->numparams = loadByte(S);
249 f->is_vararg = LoadByte(S); 249 f->is_vararg = loadByte(S);
250 f->maxstacksize = LoadByte(S); 250 f->maxstacksize = loadByte(S);
251 LoadCode(S, f); 251 loadCode(S, f);
252 LoadConstants(S, f); 252 loadConstants(S, f);
253 LoadUpvalues(S, f); 253 loadUpvalues(S, f);
254 LoadProtos(S, f); 254 loadProtos(S, f);
255 LoadDebug(S, f); 255 loadDebug(S, f);
256} 256}
257 257
258 258
259static void checkliteral (LoadState *S, const char *s, const char *msg) { 259static void checkliteral (LoadState *S, const char *s, const char *msg) {
260 char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */ 260 char buff[sizeof(LUA_SIGNATURE) + sizeof(LUAC_DATA)]; /* larger than both */
261 size_t len = strlen(s); 261 size_t len = strlen(s);
262 LoadVector(S, buff, len); 262 loadVector(S, buff, len);
263 if (memcmp(s, buff, len) != 0) 263 if (memcmp(s, buff, len) != 0)
264 error(S, msg); 264 error(S, msg);
265} 265}
266 266
267 267
268static void fchecksize (LoadState *S, size_t size, const char *tname) { 268static void fchecksize (LoadState *S, size_t size, const char *tname) {
269 if (LoadByte(S) != size) 269 if (loadByte(S) != size)
270 error(S, luaO_pushfstring(S->L, "%s size mismatch", tname)); 270 error(S, luaO_pushfstring(S->L, "%s size mismatch", tname));
271} 271}
272 272
@@ -276,23 +276,23 @@ static void fchecksize (LoadState *S, size_t size, const char *tname) {
276static void checkHeader (LoadState *S) { 276static void checkHeader (LoadState *S) {
277 /* skip 1st char (already read and checked) */ 277 /* skip 1st char (already read and checked) */
278 checkliteral(S, &LUA_SIGNATURE[1], "not a binary chunk"); 278 checkliteral(S, &LUA_SIGNATURE[1], "not a binary chunk");
279 if (LoadInt(S) != LUAC_VERSION) 279 if (loadInt(S) != LUAC_VERSION)
280 error(S, "version mismatch"); 280 error(S, "version mismatch");
281 if (LoadByte(S) != LUAC_FORMAT) 281 if (loadByte(S) != LUAC_FORMAT)
282 error(S, "format mismatch"); 282 error(S, "format mismatch");
283 checkliteral(S, LUAC_DATA, "corrupted chunk"); 283 checkliteral(S, LUAC_DATA, "corrupted chunk");
284 checksize(S, Instruction); 284 checksize(S, Instruction);
285 checksize(S, lua_Integer); 285 checksize(S, lua_Integer);
286 checksize(S, lua_Number); 286 checksize(S, lua_Number);
287 if (LoadInteger(S) != LUAC_INT) 287 if (loadInteger(S) != LUAC_INT)
288 error(S, "integer format mismatch"); 288 error(S, "integer format mismatch");
289 if (LoadNumber(S) != LUAC_NUM) 289 if (loadNumber(S) != LUAC_NUM)
290 error(S, "float format mismatch"); 290 error(S, "float format mismatch");
291} 291}
292 292
293 293
294/* 294/*
295** load precompiled chunk 295** Load precompiled chunk.
296*/ 296*/
297LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) { 297LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) {
298 LoadState S; 298 LoadState S;
@@ -306,11 +306,11 @@ LClosure *luaU_undump(lua_State *L, ZIO *Z, const char *name) {
306 S.L = L; 306 S.L = L;
307 S.Z = Z; 307 S.Z = Z;
308 checkHeader(&S); 308 checkHeader(&S);
309 cl = luaF_newLclosure(L, LoadByte(&S)); 309 cl = luaF_newLclosure(L, loadByte(&S));
310 setclLvalue2s(L, L->top, cl); 310 setclLvalue2s(L, L->top, cl);
311 luaD_inctop(L); 311 luaD_inctop(L);
312 cl->p = luaF_newproto(L); 312 cl->p = luaF_newproto(L);
313 LoadFunction(&S, cl->p, NULL); 313 loadFunction(&S, cl->p, NULL);
314 lua_assert(cl->nupvalues == cl->p->sizeupvalues); 314 lua_assert(cl->nupvalues == cl->p->sizeupvalues);
315 luai_verifycode(L, buff, cl->p); 315 luai_verifycode(L, buff, cl->p);
316 return cl; 316 return cl;