commit de84b3fecb9eb96f2d65bb754851dba8d815bb6d
parent 054179c2ffb108eb0c6535bed6288f70217c96ab
Author: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Thu, 27 Feb 2014 15:55:50 -0300
store number of upvalues of main function in front of the dump,
so that undump can create initial closure before reading its prototype
Diffstat:
2 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/ldump.c b/ldump.c
@@ -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;
}
diff --git a/lundump.c b/lundump.c
@@ -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;
}