Example #1
0
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
}
Example #2
0
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);
}
Example #3
0
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 */
}
Example #4
0
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;
}
Example #5
0
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;
	}
Example #7
0
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");
    }
  }
}
Example #8
0
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 */
}
Example #9
0
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);
    }
}
Example #10
0
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);
	}
}
Example #11
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;
}