Lua処理系コード読み(8) Closure, LClosure, CClosure

lobject.h

/*
** Closures
*/

#define ClosureHeader \
  CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist; \
  struct Table *env

typedef struct CClosure {
  ClosureHeader;
  lua_CFunction f;
  TValue upvalue[1];
} CClosure;


typedef struct LClosure {
  ClosureHeader;
  struct Proto *p;
  UpVal *upvals[1];
} LClosure;


typedef union Closure {
  CClosure c;
  LClosure l;
} Closure;

クロージャは関数の静的なデータに環境、UpValueなど動的な情報を足したもの。LuaではCで書かれた関数クロージャ(CClosure)とLuaで書かれた関数クロージャ(LClosure)がある。

test