lua

A copy of the Lua development repository
Log | Files | Refs | README

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:
Mldump.c | 3++-
Mlundump.c | 12+++---------
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; }