store number of upvalues of main function in front of the dump,

so that undump can create initial closure before reading its prototype
This commit is contained in:
Roberto Ierusalimschy 2014-02-27 15:56:15 -03:00
parent 054179c2ff
commit de84b3fecb
2 changed files with 5 additions and 10 deletions

View File

@ -1,5 +1,5 @@
/*
** $Id: ldump.c,v 2.19 2013/04/26 18:48:35 roberto Exp roberto $
** $Id: ldump.c,v 2.20 2014/02/27 16:56:20 roberto Exp roberto $
** save precompiled Lua chunks
** See Copyright Notice in lua.h
*/
@ -184,6 +184,7 @@ int luaU_dump (lua_State* L, const Proto* f, lua_Writer w, void* data, int strip
D.strip=strip;
D.status=0;
DumpHeader(&D);
DumpChar(f->sizeupvalues,&D);
DumpFunction(f,&D);
return D.status;
}

View File

@ -1,5 +1,5 @@
/*
** $Id: lundump.c,v 2.25 2014/02/13 12:11:34 roberto Exp roberto $
** $Id: lundump.c,v 2.26 2014/02/27 16:56:20 roberto Exp roberto $
** load precompiled Lua chunks
** See Copyright Notice in lua.h
*/
@ -238,17 +238,11 @@ Closure* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name)
S.Z=Z;
S.b=buff;
checkHeader(&S);
cl=luaF_newLclosure(L,1);
cl=luaF_newLclosure(L,LoadByte(&S));
setclLvalue(L,L->top,cl); incr_top(L);
cl->l.p=luaF_newproto(L);
LoadFunction(&S,cl->l.p);
if (cl->l.p->sizeupvalues != 1)
{
Proto* p=cl->l.p;
cl=luaF_newLclosure(L,cl->l.p->sizeupvalues);
cl->l.p=p;
setclLvalue(L,L->top-1,cl);
}
lua_assert(cl->l.nupvalues==cl->l.p->sizeupvalues);
luai_verifycode(L,buff,cl->l.p);
return cl;
}