2016-11-30 10 views
1

나는 C++ 프로젝트를 가지고 있으며 duktape JS 라이브러리를 사용하고 있습니다. JS에서 전역 함수를 등록하고이 함수를 사용하여 객체에 대한 포인터를 클로저 데이터로 저장해야하므로 함수가 호출 될 때이 포인터에 액세스 할 수 있습니다. duktape 마감 등록

나는 루아의 C API에서이 작업을 수행하는 방법을 알고 :

lua_pushlightuserdata(L, this); 
lua_pushcclosure(L, &someFunction, 1); 
lua_setglobal(L, "someFunction"); 

먼저 내가 폐쇄 데이터로 포인터를 추진하고있어, 다음 기능 포인터. 나는 duktape API에서 동일한 기능을 필요로한다.

클로저 등록 및 액세스가 가능한 코드를 보여줄 수 있습니까?

답변

1

"C 클로저"와 관련된 값과 직접적인 유추는 없지만 다른 방법으로 비슷한 결과를 얻을 수 있습니다.

void *ptr; 

duk_push_current_function(ctx); 
duk_get_prop_string(ctx, -1, "_ptr"); 
ptr = duk_get_pointer(ctx, -1); 
duk_pop_2(ctx); /* pop pointer and function */ 

/* ready to use 'ptr' */ 

당신이 원하는 경우로 값을, 그리고

duk_push_c_function(ctx, someFunction, 1 /*nargs*/); 
duk_push_pointer(ctx, (void *) somePointer); 
duk_put_prop_string(ctx, -2, "_ptr"); 
duk_put_global_string(ctx, "someFunction"); 

, 함수가 호출 될 때 검색 :

한 가지 간단한 방법은 함수 인스턴스의 속성으로 값을 저장하는 것입니다 Ecmascript 코드에서 관련 값에 대한 액세스를 제한하려면 internal string을 사용할 수 있습니다. "\xFF" "ptr".

0

나는 비슷한 문제가있었습니다. 검색 조금 후에, 나는 나중에 사용하기 위해 함수 (콜백) 참조 저장에 나를 위해 일한 a Wiki on howto persist objects을 찾았습니다.