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 ** save precompiled Lua chunks
** See Copyright Notice in lua.h ** 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.strip=strip;
D.status=0; D.status=0;
DumpHeader(&D); DumpHeader(&D);
DumpChar(f->sizeupvalues,&D);
DumpFunction(f,&D); DumpFunction(f,&D);
return D.status; 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 ** load precompiled Lua chunks
** See Copyright Notice in lua.h ** 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.Z=Z;
S.b=buff; S.b=buff;
checkHeader(&S); checkHeader(&S);
cl=luaF_newLclosure(L,1); cl=luaF_newLclosure(L,LoadByte(&S));
setclLvalue(L,L->top,cl); incr_top(L); setclLvalue(L,L->top,cl); incr_top(L);
cl->l.p=luaF_newproto(L); cl->l.p=luaF_newproto(L);
LoadFunction(&S,cl->l.p); LoadFunction(&S,cl->l.p);
if (cl->l.p->sizeupvalues != 1) lua_assert(cl->l.nupvalues==cl->l.p->sizeupvalues);
{
Proto* p=cl->l.p;
cl=luaF_newLclosure(L,cl->l.p->sizeupvalues);
cl->l.p=p;
setclLvalue(L,L->top-1,cl);
}
luai_verifycode(L,buff,cl->l.p); luai_verifycode(L,buff,cl->l.p);
return cl; return cl;
} }