static void LoadConstants(LoadState* S, Proto* f) { int i,n; #if LUA_REFCOUNT lua_State *L = S->L; #endif /* LUA_REFCOUNT */ n=LoadInt(S); f->k=luaM_newvector(S->L,n,TValue); f->sizek=n; #if LUA_REFCOUNT for (i=0; i<n; i++) setnilvalue2n(L, &f->k[i]); #else for (i=0; i<n; i++) setnilvalue(&f->k[i]); #endif /* LUA_REFCOUNT */ for (i=0; i<n; i++) { TValue* o=&f->k[i]; int t=LoadChar(S); switch (t) { case LUA_TNIL: setnilvalue(o); break; case LUA_TBOOLEAN: setbvalue(o,LoadChar(S)!=0); break; case LUA_TNUMBER: setnvalue(o,LoadNumber(S)); break; case LUA_TSTRING: setsvalue2n(S->L,o,LoadString(S)); break; default: error(S,"bad constant"); break; } } n=LoadInt(S); f->p=luaM_newvector(S->L,n,Proto*); f->sizep=n; for (i=0; i<n; i++) f->p[i]=NULL; #if LUA_REFCOUNT for (i=0; i<n; i++) { f->p[i]=LoadFunction(S,f->source); luarc_addrefproto(f->p[i]); } #else for (i=0; i<n; i++) f->p[i]=LoadFunction(S,f->source); #endif /* LUA_REFCOUNT */ }
Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff, const char *name) { struct LexState lexstate; struct FuncState funcstate; lexstate.buff = buff; luaX_setinput(L, &lexstate, z, luaS_new(L, name)); open_func(&lexstate, &funcstate); #if LUA_REFCOUNT luarc_addrefproto(funcstate.f); #endif /* LUA_REFCOUNT */ funcstate.f->is_vararg = VARARG_ISVARARG; /* main func. is always vararg */ luaX_next(&lexstate); /* read first token */ chunk(&lexstate); check(&lexstate, TK_EOS); close_func(&lexstate); lua_assert(funcstate.prev == NULL); lua_assert(funcstate.f->nups == 0); lua_assert(lexstate.fs == NULL); return funcstate.f; }
static void body (LexState *ls, expdesc *e, int needself, int line) { /* body -> `(' parlist `)' chunk END */ FuncState new_fs; open_func(ls, &new_fs); #if LUA_REFCOUNT luarc_addrefproto(new_fs.f); #endif /* LUA_REFCOUNT */ new_fs.f->linedefined = line; checknext(ls, '('); if (needself) { new_localvarliteral(ls, "self", 0); adjustlocalvars(ls, 1); } parlist(ls); checknext(ls, ')'); chunk(ls); new_fs.f->lastlinedefined = ls->linenumber; check_match(ls, TK_END, TK_FUNCTION, line); close_func(ls); pushclosure(ls, &new_fs, e); }
/* ** load precompiled chunk */ Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff, const char* name) { LoadState S; if (*name=='@' || *name=='=') S.name=name+1; else if (*name==LUA_SIGNATURE[0]) S.name="binary string"; else S.name=name; S.L=L; S.Z=Z; S.b=buff; LoadHeader(&S); #if LUA_REFCOUNT { Proto *proto = LoadFunction(&S,luaS_newliteral(L,"=?")); luarc_addrefproto(proto); return proto; } #else return LoadFunction(&S,luaS_newliteral(L,"=?")); #endif /* LUA_REFCOUNT */ }