- 루아를 사용하는 엔진에서 스크립트로 일종의 사용자 정의 핸들러를 만들고, 엔진에서 특정순간에 그것을 호출하고자 할 때 상당히 유용합니다. 루아상에서는 전역으로 테이블을 만들어 핸들러 함수를 집어넣고, 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()으로 삭제해주는 방식인듯 합니다.