[루아2.2] opcode.h opcode.c

2 분 소요

opcode.h

변경 코드가 몇 개 없습니다. 주요 변경은 함수를 가비지 컬랙션 대상으로 추가하기 위해서 함수용 타입을 추가한 것입니다.

[2.1]
typedef union
{
 Cfunction     f;
 real          n;
 TaggedString *ts;
 Byte         *b;
 struct Hash    *a;
 void           *u;
} Value;

[2.2]
typedef union
{
 Cfunction     f;
 real          n;
 TaggedString *ts;
 TFunc         *tf;
 struct Hash    *a;
 void           *u;
 int	       i;
} Value;

Value 공용체 말고도 함수를 Byte 타입 포인터로 표현하는 코드를 모두 TFunc 타입 포인터로 바꿨습니다. TFunc 구조체는 루아 2.2 코드에 새로 추가한 Func.h와 Func.c 파일을 읽을 때 구조를 보겠습니다.

opcode.c

변경한 양은 많은 편이지만 변경 내용은 많지 않습니다. 매크로를 만들고 반복되는 코드를 매크로로 대체한 것이 변경 코드 대부분입니다. 그 외에는 스택 초기화 관련 코드 정도입니다.

[2.1]
#define STACK_BUFFER (STACKGAP+128)

typedef int StkId;  /* index to stack elements */

static Long    maxstack = 0L;
static Object *stack = NULL;
static Object *top = NULL;

[2.2]
#define STACK_SIZE 	128

typedef int StkId;  /* index to stack elements */

static Object initial_stack;

static Object *stackLimit = &initial_stack+1;
static Object *stack = &initial_stack;
static Object *top = &initial_stack;

루아 2.1에서는 null로 표시했던 스택 초기값을 initial_stack이라는 일종의 더미 변수를 만들어서 더미 변수 포인터로 지정해서 사용합니다. 딱히 이렇게 변경해서 얻는 이득이 별로 없어 보입니다만, 아무튼 이렇게 코드를 변경했습니다.

#define incr_top	if (++top >= stackLimit) growstack()

스택 꼭대기 인덱스를 늘리고 스택 크기와 비교해서 스택 크기를 넘겼을 때 스택을 늘리는 코드를 매크로로 만들고 루아 2.1 코드에서 top++ 정도 코드로 썼던 부분을 모두 incr_top 매크로로 교체했습니다.

[2.1]
#define lua_checkstack(n)  if ((Long)(n) > maxstack) checkstack(n)

static void checkstack (StkId n)
{
 StkId t;
 if (stack == NULL)
   lua_initstack();
 if (maxstack >= MAX_INT)
   lua_error("stack size overflow");
 t = top-stack;
 maxstack *= 2;
 if (maxstack >= MAX_INT)
   maxstack = MAX_INT;
 stack = growvector(stack, maxstack, Object);
 top = stack + t;
}

[2.2]
#define lua_checkstack(nt)  if ((nt) >= stackLimit) growstack()

static void growstack (void)
{
 if (stack == &initial_stack)
   lua_initstack();
 else
 {
  StkId t = top-stack;
  Long maxstack = stackLimit - stack;
  maxstack *= 2;
  stack = growvector(stack, maxstack, Object);
  stackLimit = stack+maxstack;
  top = stack + t;
  if (maxstack >= MAX_WORD/2)
    lua_error("stack size overflow");
 }
}

함수 이름을 함수 동작에 조금더 부합하게 바꿨습니다. 코드도 바뀌었지만 기본 흐름은 같습니다. 기존에 전역 변수였던 maxstack을 로컬 변수로 바꾸고 그 역할을 stackLimit에 주었네요. 아마도 이름이 max라서 더 커질 수 없는 숫자라는 느낌이 이상했나봅니다. 그래서 limit이라는 이름으로 만들고 limit을 스택이 커질 때마다 증가시켜서 의미를 명확하게 한 것으로 보입니다.

initial_stack을 추가해서 생긴 코드 변경 외에는 딱히 중요해 보이는 코드 변경 내용은 보이지 않습니다. 빨리 빨리 넘어가니 좋네요.

댓글남기기