static void close_func (LexState *ls) { lua_State *L = ls->L; FuncState *fs = ls->fs; Proto *f = fs->f; removevars(ls, 0); luaK_ret(fs, 0, 0); /* final return */ luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); f->sizecode = fs->pc; luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); f->sizelineinfo = fs->pc; luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); f->sizek = fs->nk; luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); f->sizep = fs->np; luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); f->sizelocvars = fs->nlocvars; luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *); f->sizeupvalues = f->nups; lua_assert(luaG_checkcode(f)); lua_assert(fs->bl == NULL); ls->fs = fs->prev; L->top -= 2; /* remove table and prototype from the stack */ /* last token read was anchored in defunct function; must reanchor it */ if (fs) anchor_token(ls); }
static void close_func (LexState *ls) { lua_State *L = ls->L; FuncState *fs = ls->fs; Proto *f = fs->f; removevars(ls, 0); luaK_ret(fs, 0, 0); /* final return */ #if LUA_MEMORY_STATS luaM_setname(L, "lua.parser.code"); #endif /* LUA_MEMORY_STATS */ luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); f->sizecode = fs->pc; #if LUA_MEMORY_STATS luaM_setname(L, "lua.parser.lineinfo"); #endif /* LUA_MEMORY_STATS */ luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); f->sizelineinfo = fs->pc; #if LUA_MEMORY_STATS luaM_setname(L, "lua.parser.constants"); #endif /* LUA_MEMORY_STATS */ luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue); f->sizek = fs->nk; #if LUA_MEMORY_STATS luaM_setname(L, "lua.parser.proto"); #endif /* LUA_MEMORY_STATS */ luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); f->sizep = fs->np; #if LUA_MEMORY_STATS luaM_setname(L, "lua.parser.locals"); #endif /* LUA_MEMORY_STATS */ luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); f->sizelocvars = fs->nlocvars; #if LUA_MEMORY_STATS luaM_setname(L, "lua.parser.upvalues"); #endif /* LUA_MEMORY_STATS */ luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *); #if LUA_MEMORY_STATS luaM_setname(L, 0); #endif /* LUA_MEMORY_STATS */ f->sizeupvalues = f->nups; lua_assert(luaG_checkcode(f)); lua_assert(fs->bl == NULL); ls->fs = fs->prev; L->top -= 2; /* remove table and prototype from the stack */ /* last token read was anchored in defunct function; must reanchor it */ if (fs) anchor_token(ls); #if LUA_REFCOUNT setnilvalue(L->top + 1); setnilvalue(L->top); luarc_releasetable(L, fs->h); #endif /* LUA_REFCOUNT */ }
static void close_func (LexState *ls) { lua_State *L = ls->L; FuncState *fs = (FuncState*)ls->fsList.GetFirst(); Proto *f = fs->f; removevars(ls, 0); luaK_ret(fs, 0, 0); /* final return */ luaM_reallocvector(L, f->code, f->sizecode, fs->pc); f->sizecode = fs->pc; luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc); f->sizelineinfo = fs->pc; luaM_reallocvector(L, f->k, f->sizek, fs->nk); f->sizek = fs->nk; luaM_reallocvector(L, f->p, f->sizep, fs->np); f->sizep = fs->np; luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars); f->sizelocvars = fs->nlocvars; luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups); f->sizeupvalues = f->nups; lua_assert(luaG_checkcode(f) == true); lua_assert(fs->blockList.IsEmpty() == true); // Remove this function state from existence. ls->fsList.RemoveFirst(); // Dereference the table again. // We keep the reference on the proto, because it is the result object. fs->h->DereferenceGC( L ); /* last token read was anchored in defunct function; must reanchor it */ if ( fs ) { anchor_token(ls); } }