コード例 #1
0
ファイル: lgc.c プロジェクト: ueverything/mmo-resourse
void reallymarkobject (GCState *st, GCObject *o) {
  lua_assert(!ismarked(o));
  setbit(o->gch.marked, 0);  /* mark object */
  switch (o->gch.tt) {
    case LUA_TUSERDATA: {
      markvalue(st, gcotou(o)->uv.metatable);
      break;
    }
    case LUA_TFUNCTION: {
      gcotocl(o)->c.gclist = st->tmark;
      st->tmark = o;
      break;
    }
    case LUA_TTABLE: {
      gcotoh(o)->gclist = st->tmark;
      st->tmark = o;
      break;
    }
    case LUA_TTHREAD: {
#if LUA_REFCOUNT
      gcototh(o)->gclist_head.next = st->tmark;
#else !LUA_REFCOUNT
      gcototh(o)->gclist = st->tmark;
#endif LUA_REFCOUNT
      st->tmark = o;
      break;
    }
    case LUA_TPROTO: {
      gcotop(o)->gclist = st->tmark;
      st->tmark = o;
      break;
    }
    default: lua_assert(o->gch.tt == LUA_TSTRING || o->gch.tt == LUA_TWSTRING);
  }
}
コード例 #2
0
ファイル: lgc.c プロジェクト: ueverything/mmo-resourse
static void freeobj (lua_State *L, GCObject *o) {
  switch (o->gch.tt) {
    case LUA_TPROTO: luaF_freeproto(L, gcotop(o)); break;
    case LUA_TFUNCTION: luaF_freeclosure(L, gcotocl(o)); break;
    case LUA_TUPVAL: luaM_freelem(L, gcotouv(o)); break;
    case LUA_TTABLE: luaH_free(L, gcotoh(o)); break;
    case LUA_TTHREAD: {
      lua_assert(gcototh(o) != L && gcototh(o) != G(L)->mainthread);
      luaE_freethread(L, gcototh(o));
      break;
    }
    case LUA_TSTRING: {
      luaM_free(L, o, sizestring(gcotots(o)->tsv.len));
      break;
    }
    case LUA_TWSTRING: {
      luaM_free(L, o, sizewstring(gcototws(o)->tsv.len));
      break;
    }
    case LUA_TUSERDATA: {
      luaM_free(L, o, sizeudata(gcotou(o)->uv.len));
      break;
    }
#if LUA_REFCOUNT
	case LUA_TNIL: {
      break;  // Do nothing.
    }
#endif LUA_REFCOUNT
    default: lua_assert(0);
  }
}
コード例 #3
0
ファイル: lgc.c プロジェクト: nuclewall/bsdinstaller
static void propagatemarks (GCState *st) {
    while (st->tmark) {  /* traverse marked objects */
        switch (st->tmark->gch.tt) {
        case LUA_TTABLE: {
            Table *h = gcotoh(st->tmark);
            st->tmark = h->gclist;
            traversetable(st, h);
            break;
        }
        case LUA_TFUNCTION: {
            Closure *cl = gcotocl(st->tmark);
            st->tmark = cl->c.gclist;
            traverseclosure(st, cl);
            break;
        }
        case LUA_TTHREAD: {
            lua_State *th = gcototh(st->tmark);
            st->tmark = th->gclist;
            traversestack(st, th);
            break;
        }
        case LUA_TPROTO: {
            Proto *p = gcotop(st->tmark);
            st->tmark = p->gclist;
            traverseproto(st, p);
            break;
        }
        default:
            lua_assert(0);
        }
    }
}
コード例 #4
0
ファイル: lgc.c プロジェクト: gitrider/wxsj2
/*
** clear collected keys from weaktables
*/
static void cleartablekeys (lua_State *L, GCObject *l) {
  while (l) {
    Table *h = gcotoh(l);
    int i = sizenode(h);
    lua_assert(h->marked & KEYWEAK);
    while (i--) {
      Node *n = gnode(h, i);
      if (!valismarked(gkey(n)))  /* key was collected? */
        removekey(L, n);  /* remove entry from table */
    }
    l = h->gclist;
  }
}
コード例 #5
0
ファイル: lgc.c プロジェクト: gitrider/wxsj2
static void propagatemarks (GCState *st) {
  while (st->tmark) {  /* traverse marked objects */
    switch (st->tmark->gch.tt) {
      case LUA_TTABLE: {
        Table *h = gcotoh(st->tmark);
        st->tmark = h->gclist;
        traversetable(st, h);
        break;
      }
      case LUA_TFUNCTION: {
        Closure *cl = gcotocl(st->tmark);
        st->tmark = cl->c.gclist;
        traverseclosure(st, cl);
        break;
      }
      case LUA_TTHREAD: {
        lua_State *th = gcototh(st->tmark);
#if LUA_REFCOUNT
        st->tmark = th->gclist_head.next;
#else !LUA_REFCOUNT
        st->tmark = th->gclist;
#endif LUA_REFCOUNT
        traversestack(st, th);
        if (G(th)->userGCFunction)
		{
		  st->L = th;
          G(th)->userGCFunction(st);
		}
        break;
      }
      case LUA_TPROTO: {
        Proto *p = gcotop(st->tmark);
        st->tmark = p->gclist;
        traverseproto(st, p);
        break;
      }
#if LUA_REFCOUNT
	  case LUA_TNIL: {
        st->tmark = NULL;
        break;
      }
#endif LUA_REFCOUNT
      default: lua_assert(0);
    }
  }
}
コード例 #6
0
ファイル: lgc.c プロジェクト: gitrider/wxsj2
/*
** clear collected values from weaktables
*/
static void cleartablevalues (lua_State *L, GCObject *l) {
  while (l) {
    Table *h = gcotoh(l);
    int i = h->sizearray;
    lua_assert(h->marked & VALUEWEAK);
    while (i--) {
      TObject *o = &h->array[i];
      if (!valismarked(o))  /* value was collected? */
        setnilvalue(o);  /* remove value */
    }
    i = sizenode(h);
    while (i--) {
      Node *n = gnode(h, i);
      if (!valismarked(gval(n)))  /* value was collected? */
        removekey(L, n);  /* remove entry from table */
    }
    l = h->gclist;
  }
}