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 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 setarrayvector (lua_State *L, Table *t, int size) { int i; luaM_reallocvector(L, t->array, t->sizearray, size, TValue); for (i=t->sizearray; i<size; i++) setnilvalue(&t->array[i]); t->sizearray = size; }
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; 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; }
void luaD_checkstack (int n) { struct Stack *S = &L->stack; if (S->last-S->top <= n) { StkId top = S->top-S->stack; int stacksize = (S->last-S->stack)+STACK_UNIT+n; luaM_reallocvector(S->stack, stacksize, TObject); S->last = S->stack+(stacksize-1); S->top = S->stack + top; if (stacksize >= STACK_LIMIT) { /* stack overflow? */ if (lua_stackedfunction(100) == LUA_NOOBJECT) /* 100 funcs on stack? */ lua_error("Lua2C - C2Lua overflow"); /* doesn't look like a rec. loop */ else lua_error("stack size overflow"); } } }
static void setarrayvector (lua_State *L, Table *t, int size) { int i; #if LUA_MEMORY_STATS luaM_setname(L, "lua.arrayvector"); #endif /* LUA_MEMORY_STATS */ luaM_reallocvector(L, t->array, t->sizearray, size, TValue); #if LUA_REFCOUNT for (i=t->sizearray; i<size; i++) setnilvalue2n(L, &t->array[i]); #else for (i=t->sizearray; i<size; i++) setnilvalue(&t->array[i]); #endif /* LUA_REFCOUNT */ t->sizearray = size; #if LUA_MEMORY_STATS luaM_setname(L, 0); #endif /* LUA_MEMORY_STATS */ }
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); } }
static void unpersistproto(int ref, UnpersistInfo *upi) { /* perms reftbl ... */ Proto *p; int i; int sizep, sizek; /* We have to be careful. The GC expects a lot out of protos. In * particular, we need to give the function a valid string for its * source, and valid code, even before we actually read in the real * code. */ TString *source = luaS_newlstr(upi->L, "", 0); p = luaF_newproto(upi->L); p->source = source; p->sizecode=1; p->code = luaM_newvector(upi->L, 1, Instruction); p->code[0] = CREATE_ABC(OP_RETURN, 0, 1, 0); p->maxstacksize = 2; p->sizek = 0; p->sizep = 0; pushproto(upi->L, p); /* perms reftbl ... proto */ /* We don't need to register early, since protos can never ever be * involved in cyclic references */ /* Read in constant references */ { verify(luaZ_read(&upi->zio, &sizek, sizeof(int)) == 0); luaM_reallocvector(upi->L, p->k, 0, sizek, TObject); for(i=0; i<sizek; i++) { /* perms reftbl ... proto */ unpersist(upi); /* perms reftbl ... proto k */ setobj2s(&p->k[i], getobject(upi->L, -1)); p->sizek++; lua_pop(upi->L, 1); /* perms reftbl ... proto */ } /* perms reftbl ... proto */ } /* Read in sub-proto references */ { verify(luaZ_read(&upi->zio, &sizep, sizeof(int)) == 0); luaM_reallocvector(upi->L, p->p, 0, sizep, Proto*); for(i=0; i<sizep; i++) { /* perms reftbl ... proto */ unpersist(upi); /* perms reftbl ... proto subproto */ p->p[i] = toproto(upi->L, -1); p->sizep++; lua_pop(upi->L, 1); /* perms reftbl ... proto */ } /* perms reftbl ... proto */ } /* Read in code */ { verify(luaZ_read(&upi->zio, &p->sizecode, sizeof(int)) == 0); luaM_reallocvector(upi->L, p->code, 1, p->sizecode, Instruction); verify(luaZ_read(&upi->zio, p->code, sizeof(Instruction) * p->sizecode) == 0); } /* Read in misc values */ { verify(luaZ_read(&upi->zio, &p->nups, sizeof(lu_byte)) == 0); verify(luaZ_read(&upi->zio, &p->numparams, sizeof(lu_byte)) == 0); verify(luaZ_read(&upi->zio, &p->is_vararg, sizeof(lu_byte)) == 0); verify(luaZ_read(&upi->zio, &p->maxstacksize, sizeof(lu_byte)) == 0); } }
static void buf_resize(lua_State *L, RStack *rs, size_t nsize) { luaM_reallocvector(L, rs->rbuf.head, rs->rbuf.size, nsize, RObject); rs->rbuf.last = rs->rbuf.head + nsize; rs->rbuf.size = nsize; }