static void close_func (LexState *ls) { lua_State *L = ls->L; FuncState *fs = ls->fs; Proto *f = fs->f; removevars(ls, 0); luaK_codeABC(fs, OP_RETURN, 0, 1, 0); /* final return */ luaM_setname(L, "Lua_parser_code"); luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); f->sizecode = fs->pc; luaM_setname(L, "Lua_parser_lineinfo"); luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); f->sizelineinfo = fs->pc; luaM_setname(L, "Lua_parser_constants"); luaM_reallocvector(L, f->k, f->sizek, fs->nk, TObject); f->sizek = fs->nk; luaM_setname(L, "Lua_parser_proto"); luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); f->sizep = fs->np; luaM_setname(L, "Lua_parser_locals"); luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); f->sizelocvars = fs->nlocvars; luaM_setname(L, "Lua_parser_upvalues"); 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; #if LUA_REFCOUNT __ReleaseDirect(L, (GCObject*)fs->h); #endif LUA_REFCOUNT }
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 Proto * LoadFunction(LoadState * S, TString * p) { Proto* f; if(++S->L->nCcalls > LUAI_MAXCCALLS) error(S,"code too deep"); f=luaF_newproto(S->L); setptvalue2s(S->L,S->L->top,f); incr_top(S->L); f->source=LoadString(S); if(f->source==NULL) f->source=p; f->linedefined=LoadInt(S); f->lastlinedefined=LoadInt(S); f->nups=LoadByte(S); f->numparams=LoadByte(S); f->is_vararg=LoadByte(S); f->maxstacksize=LoadByte(S); LoadCode(S,f); LoadConstants(S,f); LoadDebug(S,f); IF (!luaG_checkcode(f), "bad code"); S->L->top--; S->L->nCcalls--; return f; }
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 traverseproto (GCState *st, Proto *f) { int i; stringmark(f->source); for (i=0; i<f->sizek; i++) { /* mark literal strings */ if (ttisstring(f->k+i) || ttiswstring(f->k+i)) stringmark(tsvalue(f->k+i)); } for (i=0; i<f->sizeupvalues; i++) /* mark upvalue names */ stringmark(f->upvalues[i]); for (i=0; i<f->sizep; i++) /* mark nested protos */ markvalue(st, f->p[i]); for (i=0; i<f->sizelocvars; i++) /* mark local-variable names */ stringmark(f->locvars[i].varname); lua_assert(luaG_checkcode(f)); }
static Proto* LoadFunction (LoadState* S, TString* p) { Proto* f=luaF_newproto(S->L); f->source=LoadString(S); if (f->source==NULL) f->source=p; f->lineDefined=LoadInt(S); f->nups=LoadByte(S); f->numparams=LoadByte(S); f->is_vararg=LoadByte(S); f->maxstacksize=LoadByte(S); LoadLines(S,f); LoadLocals(S,f); LoadUpvalues(S,f); LoadConstants(S,f); LoadCode(S,f); #ifndef TRUST_BINARIES if (!luaG_checkcode(f)) luaG_runerror(S->L,"bad code in %s",S->name); #endif return f; }
static Proto* LoadFunction(LoadState* S, TString* p) { Proto* f=luaF_newproto(S->L); setptvalue2s(S->L,S->L->top,f); incr_top(S->L); f->source=LoadString(S); if (f->source==NULL) f->source=p; f->linedefined=LoadInt(S); f->lastlinedefined=LoadInt(S); f->nups=LoadByte(S); f->numparams=LoadByte(S); f->is_vararg=LoadByte(S); f->maxstacksize=LoadByte(S); LoadLines(S,f); LoadLocals(S,f); LoadUpvalues(S,f); LoadConstants(S,f); LoadCode(S,f); IF (!luaG_checkcode(f), "bad code"); S->L->top--; return f; }
static void close_func (LexState *ls) { lua_State *L = ls->L; FuncState *fs = ls->fs; Proto *f = fs->f; removevars(ls, 0); luaK_codeABC(fs, OP_RETURN, 0, 1, 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, TObject); 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; }
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); } }