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 对象被虚拟机的 标记-清除 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的简写,复合类型,用来表示类型,一共包含三个部分,分别是:
/*
** 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表示是否可以垃圾回收
标记为需标记-清除 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 对象被虚拟机的 标记-清除 GC 所管理的类型有:
- string
- userdata
- Closure(function)
- table
- thread
- Proto
要注意的是:
UpVal 对象不再作为 GC 对象被虚拟机的 标记-清除GC 所管理,而是单独使用引用计数的方法管理。
网友评论