Lua 5.1.4
判斷是否需要GC:
#define ttype(o) ((o)->tt)
#define iscollectable(o) (ttype(o) >= LUA_TSTRING)
GC對象GCObject union:
/*
** Union of all collectable objects
*/
union GCObject {
GCheader gch;
union TString ts;
union Udata u;
union Closure cl;
struct Table h;
struct Proto p;
struct UpVal uv;
struct lua_State th; /* thread */
};
作為 GC 對象被虛擬機的 標(biāo)記-清除 GC 所管理的類型有:
- string
- userdata
- Closure(function)
- table
- thread
- Proto
- UpVal
Lua 5.3.4
#define TValuefields Value value_; int tt_
struct lua_TValue {
TValuefields;
};
typedef struct lua_TValue TValue;
==> TValue =
struct lua_TValue {
Value value_;
int tt_;
};
其中斯稳,tt_是tag type的簡寫,復(fù)合類型聂儒,用來表示類型,一共包含三個部分外驱,分別是:
/*
** tags for Tagged Values have the following use of bits:
** bits 0-3: actual tag (a LUA_T* value)
** bits 4-5: variant bits
** bit 6: whether value is collectable
*/
- 0-3表示大類型
- 4-5表示表示類型的變體刻剥,例如:字符串LUA_TSTRING有兩種變體(短字符串:LUA_TSHRSTR和長字符串:LUA_TLNGSTR)
- 6表示是否可以垃圾回收
標(biāo)記為需標(biāo)記-清除 GC 所管理的對象:
#define BIT_ISCOLLECTABLE (1 << 6) = 64 = 0100 0000
/* mark a tag as collectable */
#define ctb(t) ((t) | BIT_ISCOLLECTABLE)
判斷是否需要GC:
#define rttype(o) ((o)->tt_)
#define iscollectable(o) (rttype(o) & BIT_ISCOLLECTABLE)
GC對象union:
/*
** Union of all collectable objects (only for conversions)
*/
union GCUnion {
GCObject gc; /* common header */
struct TString ts;
struct Udata u;
union Closure cl;
struct Table h;
struct Proto p;
struct lua_State th; /* thread */
};
作為 GC 對象被虛擬機的 標(biāo)記-清除 GC 所管理的類型有:
- string
- userdata
- Closure(function)
- table
- thread
- Proto
要注意的是:
UpVal 對象不再作為 GC 對象被虛擬機的 標(biāo)記-清除GC 所管理遮咖,而是單獨使用引用計數(shù)的方法管理。