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 retstat (LexState *ls) { /* stat -> RETURN explist */ FuncState *fs = ls->fs; expdesc e; int first, nret; /* registers with returned values */ luaX_next(ls); /* skip RETURN */ if (block_follow(ls->t.token) || ls->t.token == ';') first = nret = 0; /* return no values */ else { nret = explist1(ls, &e); /* optional return values */ if (hasmultret(e.k)) { luaK_setmultret(fs, &e); if (e.k == VCALL && nret == 1) { /* tail call? */ SET_OPCODE(getcode(fs,&e), OP_TAILCALL); lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar); } first = fs->nactvar; nret = LUA_MULTRET; /* return all values */ } else { if (nret == 1) /* only one single value? */ first = luaK_exp2anyreg(fs, &e); else { luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ first = fs->nactvar; /* return all `active' values */ lua_assert(nret == fs->freereg - first); } } } luaK_ret(fs, first, nret); }
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; global_State *g = G(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; if ( g->storedebug ) /* save memory when debugger will not be used */ { luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); f->sizelineinfo = fs->pc; }
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); } }