28#if !defined(luai_verifycode)
29#define luai_verifycode(L,f)
40static l_noret error (
LoadState *S,
const char *why) {
41 luaO_pushfstring(S->L,
"%s: bad binary format (%s)", S->name, why);
42 luaD_throw(S->L, LUA_ERRSYNTAX);
50#define loadVector(S,b,n) loadBlock(S,b,(n)*sizeof((b)[0]))
52static void loadBlock (
LoadState *S,
void *b,
size_t size) {
53 if (luaZ_read(S->Z, b, size) != 0)
54 error(S,
"truncated chunk");
58#define loadVar(S,x) loadVector(S,&x,1)
64 error(S,
"truncated chunk");
69static size_t loadUnsigned (
LoadState *S,
size_t limit) {
76 error(S,
"integer overflow");
77 x = (x << 7) | (b & 0x7f);
78 }
while ((b & 0x80) == 0);
84 return loadUnsigned(S, ~(
size_t)0);
89 return cast_int(loadUnsigned(S, INT_MAX));
93static lua_Number loadNumber (
LoadState *S) {
100static lua_Integer loadInteger (
LoadState *S) {
113 size_t size = loadSize(S);
116 else if (--size <= LUAI_MAXSHORTLEN) {
117 char buff[LUAI_MAXSHORTLEN];
118 loadVector(S, buff, size);
119 ts = luaS_newlstr(L, buff, size);
122 ts = luaS_createlngstrobj(L, size);
123 setsvalue2s(L, L->top.p, ts);
125 loadVector(S, getstr(ts), size);
128 luaC_objbarrier(L, p, ts);
137 TString *st = loadStringN(S, p);
139 error(S,
"bad format for constant string");
146 f->code = luaM_newvectorchecked(S->L, n, Instruction);
148 loadVector(S, f->code, n);
158 f->k = luaM_newvectorchecked(S->L, n,
TValue);
160 for (i = 0; i < n; i++)
161 setnilvalue(&f->k[i]);
162 for (i = 0; i < n; i++) {
176 setfltvalue(o, loadNumber(S));
179 setivalue(o, loadInteger(S));
183 setsvalue2n(S->L, o, loadString(S, f));
185 default: lua_assert(0);
194 f->p = luaM_newvectorchecked(S->L, n,
Proto *);
196 for (i = 0; i < n; i++)
198 for (i = 0; i < n; i++) {
199 f->p[i] = luaF_newproto(S->L);
200 luaC_objbarrier(S->L, f, f->p[i]);
201 loadFunction(S, f->p[i], f->source);
215 f->upvalues = luaM_newvectorchecked(S->L, n,
Upvaldesc);
217 for (i = 0; i < n; i++)
218 f->upvalues[i].name = NULL;
219 for (i = 0; i < n; i++) {
220 f->upvalues[i].instack = loadByte(S);
221 f->upvalues[i].idx = loadByte(S);
222 f->upvalues[i].kind = loadByte(S);
230 f->lineinfo = luaM_newvectorchecked(S->L, n, ls_byte);
232 loadVector(S, f->lineinfo, n);
234 f->abslineinfo = luaM_newvectorchecked(S->L, n,
AbsLineInfo);
235 f->sizeabslineinfo = n;
236 for (i = 0; i < n; i++) {
237 f->abslineinfo[i].pc = loadInt(S);
238 f->abslineinfo[i].line = loadInt(S);
241 f->locvars = luaM_newvectorchecked(S->L, n,
LocVar);
243 for (i = 0; i < n; i++)
244 f->locvars[i].varname = NULL;
245 for (i = 0; i < n; i++) {
246 f->locvars[i].varname = loadStringN(S, f);
247 f->locvars[i].startpc = loadInt(S);
248 f->locvars[i].endpc = loadInt(S);
253 for (i = 0; i < n; i++)
254 f->upvalues[i].name = loadStringN(S, f);
259 f->source = loadStringN(S, f);
260 if (f->source == NULL)
262 f->linedefined = loadInt(S);
263 f->lastlinedefined = loadInt(S);
264 f->numparams = loadByte(S);
265 f->is_vararg = loadByte(S);
266 f->maxstacksize = loadByte(S);
275static void checkliteral (
LoadState *S,
const char *s,
const char *msg) {
276 char buff[
sizeof(LUA_SIGNATURE) +
sizeof(LUAC_DATA)];
277 size_t len = strlen(s);
278 loadVector(S, buff, len);
279 if (memcmp(s, buff, len) != 0)
284static void fchecksize (
LoadState *S,
size_t size,
const char *tname) {
285 if (loadByte(S) != size)
286 error(S, luaO_pushfstring(S->L,
"%s size mismatch", tname));
290#define checksize(S,t) fchecksize(S,sizeof(t),#t)
294 checkliteral(S, &LUA_SIGNATURE[1],
"not a binary chunk");
295 if (loadByte(S) != LUAC_VERSION)
296 error(S,
"version mismatch");
297 if (loadByte(S) != LUAC_FORMAT)
298 error(S,
"format mismatch");
299 checkliteral(S, LUAC_DATA,
"corrupted chunk");
300 checksize(S, Instruction);
301 checksize(S, lua_Integer);
302 checksize(S, lua_Number);
303 if (loadInteger(S) != LUAC_INT)
304 error(S,
"integer format mismatch");
305 if (loadNumber(S) != LUAC_NUM)
306 error(S,
"float format mismatch");
316 if (*name ==
'@' || *name ==
'=')
318 else if (*name == LUA_SIGNATURE[0])
319 S.name =
"binary string";
325 cl = luaF_newLclosure(L, loadByte(&S));
326 setclLvalue2s(L, L->top.p, cl);
328 cl->p = luaF_newproto(L);
329 luaC_objbarrier(L, cl, cl->p);
330 loadFunction(&S, cl->p, NULL);
331 lua_assert(cl->nupvalues == cl->p->sizeupvalues);
332 luai_verifycode(L, cl->p);