U E D R S I H C RSS
ID
Password
Join
진정으로 어떤 논쟁을 매듭짓고 싶으면 "당신 말이 옳은 것 같군요"라고 말하도록 노력할 것. ―F.F.W.

사용 예 #

  • 루아를 사용하는 엔진에서 스크립트로 일종의 사용자 정의 핸들러를 만들고, 엔진에서 특정순간에 그것을 호출하고자 할 때 상당히 유용합니다. 루아상에서는 전역으로 테이블을 만들어 핸들러 함수를 집어넣고, C에서는 참조만을 가지고 호출하게하면 상당히 유용하겠죠.
int KeyHandlerRef;  // 저장해놓을 "함수"에 대한 호출값

int SetKeyFunc( lua_State* L )
{
  KeyHandlerRef = lua_ref( L, 1 ); // 현재 스택상에서 top 위치에 있는 값의 참조를 가져온다. (잠금 여부를 확인한다)
}

void CallKeyHandler( lua_State* L, int key )
{
  lua_getref( L, KeyHandlerRef );       // 스택에 함수를 다시 돌려놓는다. (push한다. 즉, top에 위치하게 된다.)
  lua_pushnumber( L, key );             // 함수의 인자를 넣는다.
  lua_call( L, 1, 0 );                  // 함수를 호출한다. (에러 검사를 위해서 lua_pcall()를 사용하는 것도 좋다)
  lua_pop( L, 1 );                      // 함수를 호출했으므로 스택으로부터 제거한다.
}
  • 위 소스는 그냥 메일링 리스트에서 배껴온 것에 주석만 한글화한 겁니다. lua_ref()관련 문서가 전무하기땜시... :( 아무래도 위와 같이 호출을 계속하다가, 더이상 함수의 참조가 쓸모없어지거나, state상에서 함수가 제거될 경우(예를 들면, gc가 가동된다던가...)에는 lua_unref(L, 참조)를 실행하면 됩니다.
  • lua_ref()의 원리는 (추측이지만) REGISTRY 전역테이블에 현재 함수를 백업해놓고 그 인덱스를 가지고 있다가, 나중에 lua_unref()으로 삭제해주는 방식인듯 합니다.

레퍼런스 #

  • 아래는 간단한 레퍼런스 입니다. (lua.h에서 퍼왔습니다.)
int ref = lua_ref(L, 0 또는 1)
  • lock은 1일 경우 잠금이 실행됩니다. 만일 한번더 호출될 경우, 에러가 발생하게 만듭니다.
  • 반환값은 int형 참조인덱스가 반환되며, LUA_REFNIL(-1)이 반환될 경우 NIL값을 참조하려했다는 의미가 됩니다. (이 경우는 나중에 lua_unref()할 필요없습니다)
void lua_getref(L, ref)
  • 현재 지정한 참조값을 현재 스택의 top에 푸쉬합니다. (즉, 이 함수 실행 후 알맞게 인자를 push한 후 lua_call/lua_pcall하면 됩니다.)
void lua_unref(L, ref)
  • 지정한 참조값에 해당하는 참조를 없앱니다. 이 함수를 실행하면 더이상 lua_getref(L,ref)를 실행할 수 없습니다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.3539 sec