lua 5.3.4 GC管理对象类型的变化

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 所管理的类型有:

  1. string
  2. userdata
  3. Closure(function)
  4. table
  5. thread
  6. Proto
  7. 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 
*/
  1. 0-3表示大类型
  2. 4-5表示表示类型的变体,例如:字符串LUA_TSTRING有两种变体(短字符串:LUA_TSHRSTR和长字符串:LUA_TLNGSTR)
  3. 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 所管理的类型有:

  1. string
  2. userdata
  3. Closure(function)
  4. table
  5. thread
  6. Proto

要注意的是:

UpVal 对象不再作为 GC 对象被虚拟机的 标记-清除GC 所管理,而是单独使用引用计数的方法管理。

链接:UpVal变为引用计数

你可能感兴趣的:(lua 5.3.4 GC管理对象类型的变化)