[루아2.2] func.h func.c

1 분 소요

func.h

func.h와 func.c 파일은 루아 2.2에서 새로 생긴 파일입니다. 아마도 함수를 가비지 컬랙션에 포함하려고 함수 오브젝트를 관리하는 코드를 구현한 것으로 보입니다.

typedef struct TFunc
{
  struct TFunc	*next;
  char		marked;
  int		size;
  Byte		*code;
  int		lineDefined;
  char		*fileName;
} TFunc;

TFunc 구조체 자료 구조를 보면 의도를 명확히 파악할 수 있습니다. 일단 링크드 리스트고요. marked 멤버 변수가 있는 것을 보니 가비지 컬랙션에서 처리하는 자료 구조입니다. 나머지 멤버 변수는 아마 함수 바이트 코드 크기, 바이트 코드 주소, 함수(파일?) 이름으로 보입니다.

func.c

소스 구현은 짧습니다. 그리고 다른 테이블 관리 함수와 패턴이 비슷합니다. 빨리 읽고 넘어갈 수 있을 것 같습니다. 읽어 보겠습니다.

static TFunc *function_root = NULL;


/*
** Insert function in list for GC
*/
void luaI_insertfunction (TFunc *f)
{
  lua_pack();
  f->next = function_root;
  function_root = f;
  f->marked = 0;
}

루아 명령어 중 PUSHFUNCTION 명령어를 처리할 때 호출합니다. prefix가 luaI인것으로 보아 루아 API이기도 하군요. 내용은 파라메터로 넘어오는 루아 함수 오브젝트 f를 루아 함수 객체 링크드 리스트의 헤더 function_root에 연결합니다.

static void freefunc (TFunc *f)
{
  luaI_free (f->code);
  luaI_free (f);
}

/*
** Garbage collection function.
** This function traverse the function list freeing unindexed functions
*/
Long luaI_funccollector (void)
{
  TFunc *curr = function_root;
  TFunc *prev = NULL;
  Long counter = 0;
  while (curr)
  {
    TFunc *next = curr->next;
    if (!curr->marked)
    {
      if (prev == NULL)
        function_root = next;
      else
        prev->next = next;
      freefunc (curr);
      ++counter;
    }
    else
    {
      curr->marked = 0;
      prev = curr;
    } 
    curr = next;
  }
  return counter;
}

가비지 컬랙션하는 함수입니다. lua_pack()에서 luaI_funccollector()를 호출합니다. 루아 함수 오브젝트 링크드 리스트를 순회하면서 마킹되지 않은 객체는 freefunc() 메모리 해제합니다.

void lua_funcinfo (lua_Object func, char **filename, int *linedefined)
{
  Object *f = luaI_Address(func);
  if (f->tag == LUA_T_MARK || f->tag == LUA_T_FUNCTION)
  {
    *filename = f->value.tf->fileName;
    *linedefined = f->value.tf->lineDefined;
  }
  else if (f->tag == LUA_T_CMARK || f->tag == LUA_T_CFUNCTION)
  {
    *filename = "(C)";
    *linedefined = -1;
  }
}

함수 오브젝트를 파라메터로 넘기면 함수 이름과 linedefined 멤버 변수 정보를 reference로 리턴합니다.

루아 2.2 읽기 끝

세 번 정도 반복해서 읽으니 어느 정도 코딩 패턴이 눈에 들어오는 것 같습니다. 다음 릴리즈는 2.4입니다. 역시 마이너 업데이트이므로 이번처러 변경점 위주로 빨리 읽어볼 예정입니다. 그리고 2.5 이후에 3.0이군요. 2.4와 2.5는 빨리 읽고 넘어가고 3.0에서 다시 정독하겠습니다.

댓글남기기