2015-02-01 8 views
3

나는 실행중인 프로세스의 루아 스크립트 디버거를 작성하는 노력하고있어 및 (C에서) 그렇게하는 문서화 된 방법은 lua_sethook 사용하는 것입니다lua_sethook 컨텍스트를 lua_sethook와 연결하는 방법은 무엇입니까?

typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); 
:

int lua_sethook (lua_State *L, lua_Hook f, int mask, int count); 

lua_Hook는 다음과 같이 정의된다

후크는 lua_State 포인터 만 가져옵니다.이 포인터는 내 디버거 클래스에 포인터를 연결하여 그 위치에서 다시 디버거 클래스로 가져올 수 있습니까?

lua_State 인스턴스가 여러 개인 경우이 경우 전역 변수를 사용하지 않는 것이 좋습니다. 나는 디버거 인스턴스에 lua_State * 포인터의 맵을 사용할 수 있다고 생각하지만, 효율적이지는 않습니다. lua_State *에 전역으로 저장하는 것은 이해할 수없는 것처럼 보입니다. 검색 할 수 있으려면 최소한 하나의 값을 루아 스택에 넣어야 만합니다.이 경우에는 어렵거나 불가능한 것처럼 보입니다. 루아 스택 오버플로.

내가 누락 된 항목이 있습니까? 나는 어떻게 이것을 성취 할 것인가? 알아요, 루아 코드에서이 작업을 수행 할 수 있지만 C 측에서이 작업을 수행 할 수있는 방법을 알고 싶습니다.

+0

디버거 클래스와'lua_State'의 다중성 관계는 무엇입니까? 예를 들어, 주어진'lua_State'에 최대 하나의 디버거 클래스가 있다고 가정 할 수 있습니까? 디버거 클래스가 여러 lua_State 사이에서 공유 될 수 있습니까? 아니면 각 lua_State가 고유 한 독립 실행 형 디버거 클래스를 가질 수 있습니까? – greatwolf

+0

내 경우에는 1 : 1 관계입니다. 디버거 클래스는 하나의 lua_State *에 대한 포인터를 가지며, 어떻게 든 lua_Hook 함수의 lua_State *에서 디버거 클래스로 효과적으로 갈 수 있어야합니다. – Tom

+2

루아 레지스트리에 저장하는 것은 어떨까요? 여전히'hook' 함수로 스택에 푸시해야하지만, 오버플로가 걱정되는 이유는 모르겠습니다. 'lua_checkstack'을 그냥 할 수는 없습니까? 그리고 C 코드에서 실패하면 그냥 할 수 있습니까? – greatwolf

답변

0

궁극적으로 값을 후크 기능과 직접 연결할 수 없습니다.

하지만 간접적으로 다양한 방법으로 처리 할 수 ​​있습니다. 가장 안전한 방법은 아마도 루아 레지스트리 내의 알려진 위치에 값을 넣는 것이다. 당신은 또한 그것을 세계화시킬 수 있습니다. 그러나 당신은 그것을 수행하지만, lua_State 객체를 통해 액세스 할 수 있어야합니다.

등록 된 Lua 인스턴스 외부의 데이터를 사용하는 것은 위험합니다. 즉, lua_State 포인터를 등록 된 인스턴스 데이터에 매핑하는 연관 컨테이너가 있다고 생각할 수 있습니다. 그러나, 당신이 이것을 시도한다면, 그들은 Lua 코 루틴의 실행 중에 당신의 훅 함수가 호출 될 때 실패 할 수있다. 왜냐하면 그것들은 주 스레드로부터 개별적인 lua_State 객체들을 가지고 있기 때문이다.