Lua処理系コード読み(10) UpVal

lobject.h

/*
** Upvalues
*/

typedef struct UpVal {
  CommonHeader;
  TValue *v;  /* points to stack or to its own value */
  union {
    TValue value;  /* the value (when closed) */
    struct {  /* double linked list (when open) */
      struct UpVal *prev;
      struct UpVal *next;
    } l;
  } u;
} UpVal;

実行中の関数のUpValueは両方向リンクリストで繋がれている(when open)。関数が終了したとき(when closed)に生きているUpValueはuv.value → uv.vという参照を持つオブジェクトとして関数終了後も生き続ける。
# lfunc.cのluaF_close

test