Example #1
0
ClassMethodDispatch* luaQ_newclassmethodenv( lua_State *L, Class *j, GCObject *prevEnv )
{
    ClassMethodDispatch *outObj = NULL;
    {
        global_State *g = G(L);

        dispatchTypeInfoPlugin_t *dispatchEnv = dispatchTypeInfoPlugin.GetPluginStruct( g->config );

        if ( dispatchEnv )
        {
            ClassMethodDispatch *q = lua_new <ClassMethodDispatch> ( L, dispatchEnv->dispatchClassMethodEnvTypeInfo );

            if ( q )
            {
                q->m_class = j;
                luaC_objbarrier( L, q, j );
                q->m_prevEnv = prevEnv;
                luaC_objbarrier( L, q, prevEnv );

                outObj = q;
            }
        }
    }
    return outObj;
}
Example #2
0
static int indexupvalue(FuncState* fs, TString* name, expdesc* v)
{
	int i;
	Proto* f = fs->f;
	int oldsize = f->sizeupvalues;
	for (i = 0; i < f->nups; i++)
	{
		if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->u.s.info)
		{
			lua_assert(f->upvalues[i] == name);
			return i;
		}
	}
	/* new one */
	luaY_checklimit(fs, f->nups + 1, LUAI_MAXUPVALUES, "upvalues");
	luaM_growvector(fs->L, f->upvalues, f->nups, f->sizeupvalues,
			TString*, MAX_INT, "");
	while (oldsize < f->sizeupvalues) f->upvalues[oldsize++] = NULL;
	f->upvalues[f->nups] = name;
	luaC_objbarrier(fs->L, f, name);
	lua_assert(v->k == VLOCAL || v->k == VUPVAL);
	fs->upvalues[f->nups].k = cast_byte(v->k);
	fs->upvalues[f->nups].info = cast_byte(v->u.s.info);
	return f->nups++;
}
Example #3
0
static void pushclosure (LexState *ls, FuncState *func, expdesc *v) {
  FuncState *fs = ls->fs;
  Proto *f = fs->f;
  int oldsize = f->sizep;
  int i;
#if LUA_MEMORY_STATS
  luaM_setname(ls->L, "lua.parser.closures");
#endif /* LUA_MEMORY_STATS */
  luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *,
                  MAXARG_Bx, "constant table overflow");
#if LUA_MEMORY_STATS
  luaM_setname(ls->L, 0);
#endif /* LUA_MEMORY_STATS */
  while (oldsize < f->sizep) f->p[oldsize++] = NULL;
  f->p[fs->np++] = func->f;
#if LUA_REFCOUNT
  /* already got a reference */
  /* luarc_addrefproto(func->f); */
#endif /* LUA_REFCOUNT */
  luaC_objbarrier(ls->L, f, func->f);
  init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1));
  for (i=0; i<func->f->nups; i++) {
    OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
    luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0);
  }
}
Example #4
0
static void pushclosure (LexState *ls, FuncState *func, expdesc *v)
{
    FuncState *fs = GetCurrentFuncState( ls );
    Proto *f = fs->f;
    int oldsize = f->sizep;

    luaM_growvector(ls->L, f->p, fs->np, f->sizep, MAXARG_Bx, "constant table overflow");

    while ( oldsize < f->sizep )
    {
        f->p[ oldsize++ ] = NULL;
    }

    f->p[ fs->np++ ] = func->f;
    luaC_objbarrier( ls->L, f, func->f );

    init_exp( v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1) );

    for ( int i = 0; i < func->f->nups; i++ )
    {
        OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;

        luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0);
    }
}
Example #5
0
static int registerlocalvar (LexState *ls, TString *varname) {
  FuncState *fs = ls->fs;
  Proto *f = fs->f;
  int oldsize = f->sizelocvars;
  luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,
                  LocVar, SHRT_MAX, "local variables");
  while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL;
  f->locvars[fs->nlocvars].varname = varname;
  luaC_objbarrier(ls->L, f, varname);
  return fs->nlocvars++;
}
Example #6
0
/*
** fill a closure with new closed upvalues
*/
void luaF_initupvals (lua_State *L, LClosure *cl) {
  int i;
  for (i = 0; i < cl->nupvalues; i++) {
    GCObject *o = luaC_newobj(L, LUA_TUPVAL, sizeof(UpVal));
    UpVal *uv = gco2upv(o);
    uv->v = &uv->u.value;  /* make it closed */
    setnilvalue(uv->v);
    cl->upvals[i] = uv;
    luaC_objbarrier(L, cl, o);
  }
}
Example #7
0
/*
** barrier for prototypes. When creating first closure (cache is
** NULL), use a forward barrier; this may be the only closure of the
** prototype (if it is a "regular" function, with a single instance)
** and the prototype may be big, so it is better to avoid traversing
** it again. Otherwise, use a backward barrier, to avoid marking all
** possible instances.
*/
LUAI_FUNC void luaC_barrierproto_ (lua_State *L, Proto *p, Closure *c) {
	global_State *g = G(L);
	lua_assert(isblack(obj2gco(p)));
	if (p->cache == NULL) {  /* first time? */
	luaC_objbarrier(L, p, c);
	}
	else {  /* use a backward barrier */
	black2gray(obj2gco(p));  /* make prototype gray (again) */
	p->gclist = g->grayagain;
	g->grayagain = obj2gco(p);
	}
}
Example #8
0
static int newupvalue (FuncState *fs, TString *name, expdesc *v) {
  Proto *f = fs->f;
  int oldsize = f->sizeupvalues;
  checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues");
  luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues,
                  Upvaldesc, MAXUPVAL, "upvalues");
  while (oldsize < f->sizeupvalues) f->upvalues[oldsize++].name = NULL;
  f->upvalues[fs->nups].instack = (v->k == VLOCAL);
  f->upvalues[fs->nups].idx = cast_byte(v->u.info);
  f->upvalues[fs->nups].name = name;
  luaC_objbarrier(fs->ls->L, f, name);
  return fs->nups++;
}
Example #9
0
LUA_API int lua_setmetatable (lua_State *L, int objindex) {
  TValue *obj;
  Table *mt;
  lua_lock(L);
  api_checknelems(L, 1);
  obj = index2addr(L, objindex);
  if (ttisnil(L->top - 1))
    mt = NULL;
  else {
    api_check(ttistable(L->top - 1), "table expected");
    mt = hvalue(L->top - 1);
  }
  switch (ttnov(obj)) {
    case LUA_TTABLE: {
      hvalue(obj)->metatable = mt;
      if (mt) {
        luaC_objbarrier(L, gcvalue(obj), mt);
        luaC_checkfinalizer(L, gcvalue(obj), mt);
      }
      break;
    }
    case LUA_TUSERDATA: {
      uvalue(obj)->metatable = mt;
      if (mt) {
        luaC_objbarrier(L, uvalue(obj), mt);
        luaC_checkfinalizer(L, gcvalue(obj), mt);
      }
      break;
    }
    default: {
      G(L)->mt[ttnov(obj)] = mt;
      break;
    }
  }
  L->top--;
  lua_unlock(L);
  return 1;
}
Example #10
0
LUA_API void lua_setuservalue (lua_State *L, int idx) {
	StkId o;
	lua_lock(L);
	api_checknelems(L, 1);
	o = index2addr(L, idx);
	api_check(L, ttisuserdata(o), "userdata expected");
	if (ttisnil(L->top - 1))
	uvalue(o)->env = NULL;
	else {
	api_check(L, ttistable(L->top - 1), "table expected");
	uvalue(o)->env = hvalue(L->top - 1);
	luaC_objbarrier(L, gcvalue(o), hvalue(L->top - 1));
	}
	L->top--;
	lua_unlock(L);
}
Example #11
0
static int registerlocalvar (LexState *ls, TString *varname) {
  FuncState *fs = ls->fs;
  Proto *f = fs->f;
  int oldsize = f->sizelocvars;
#if LUA_MEMORY_STATS
  luaM_setname(ls->L, "lua.parser.locals");
#endif /* LUA_MEMORY_STATS */
  luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,
                  LocVar, SHRT_MAX, "too many local variables");
#if LUA_MEMORY_STATS
  luaM_setname(ls->L, 0);
#endif /* LUA_MEMORY_STATS */
  while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL;
  f->locvars[fs->nlocvars].varname = varname;
  luaC_objbarrier(ls->L, f, varname);
#if LUA_REFCOUNT
  luarc_addrefstring(varname);
#endif /* LUA_REFCOUNT */
  return fs->nlocvars++;
}