Ver Fonte

store number of upvalues of main function in front of the dump,
so that undump can create initial closure before reading its prototype

Roberto Ierusalimschy há 11 anos atrás
pai
commit
de84b3fecb
2 ficheiros alterados com 5 adições e 10 exclusões
  1. 2 1
      ldump.c
  2. 3 9
      lundump.c

+ 2 - 1
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
 ** 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;
 }
 }

+ 3 - 9
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
 ** 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)
- {
-  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);
  luai_verifycode(L,buff,cl->l.p);
  return cl;
  return cl;
 }
 }