2013-03-31 3 views
0

방금 ​​JavaScript V8을 사용하고 Embedder's Guide에서 기본 예제를 컴파일했습니다. 이제 C++ 함수를 JavaScript 컨텍스트에 바인딩하려고합니다.std :: function을 JavaScript V8에 바인딩하는 방법은 무엇입니까?

당분간은 나중에 바인딩을 처리해야하는 빈 클래스 만 있습니다.

class Manager 
{ 
public: 
    Manager() 
    { 
     context = Context::New(); 
    } 
    void Bind(string Name, function<Handle<Value>(const Arguments&)> Function) 
    { 
     // bind the function to the given context 
    } 
private: 
    Persistent<Context> context; 
}; 
내가 자바 스크립트 V8 컨텍스트에 std::function 개체를 결합 할 수있는 방법

?

+1

내가 무효 BindExample'같은 내 엔진의 기능을 결합하는 데 사용 (V8 :: 처리 엔진) {엔진 -> 설정 (V8 :: 문자열 :: 새로운 ("FunctionInJS"), v8 :: FunctionTemplate :: New (FunctionInCPP)); }'. 어떻게 든 도움이 되나요? –

+0

저에게 도움이되었지만, 당신의 예제에서 엔진이라는 핸들이 정확히 무엇입니까? 그러나 실제로 중요한 문제는'std :: function'을 매개 변수로 전달하는 것입니다. – danijar

+0

'std :: function'에 대한 답과 제 제안에 대한 제 전체 예제를 참조하십시오. –

답변

0

Set 함수에 의해 요청 된 매개 변수 유형 InvocationCallback은 간단한 typedef입니다.

typedef Handle<Value> (*InvocationCallback)(Arguments const &); 

따라서 std::function을 원시 함수 포인터로 변환해야했습니다.

void Register(string Name, function<Handle<Value>(Arguments const &)> Function) 
{ 
    InvocationCallback* function = Function.target<InvocationCallback>(); 
    globals->Set(String::New(Name.c_str()), FunctionTemplate::New(*function)); 
} 
+0

다른 질문에서 알 수 있듯이 일반적인 경우에는 작동하지 않기 때문에이 대답을 받아 들여야합니다. – minexew

+0

@minexew 당신이 말하는 다른 질문에 대한 링크를 제공 할 수 있습니까? – danijar

+0

@danjiar http://stackoverflow.com/a/15751351/2524350 – minexew

2

내 엔진에서 사용한 것은 다소 복잡한 방법 이었지만 처음부터 생각해 냈습니다. (슬프게도 나는이 최적화되지 않았습니다 않도록 LLVM에 V8에서 이동.)

void ExposeFunctions(v8::Handle<v8::ObjectTemplate> engine) { 
    /* ... */ 
    engine->Set(v8::String::New("Exit"), v8::FunctionTemplate::New(NativeExit)); 
    engine->Set(v8::String::New("Log"), v8::FunctionTemplate::New(NativeLog)); 
    /* ... */ 
} 

int SpawnEngine() { 
    v8::Locker locker; 
    v8::HandleScope handleScope; 
    v8::TryCatch exceptionManager; 
    v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); 
    ExposeFunctions(global); 
    v8::Persistent<v8::Context> context = v8::Context::New(nullptr, global); 
    v8::Context::Scope scope(context); 
    /* ... */ 
    context.Dispose(); 
    return 0; 
} 

이 당신이 필요에 따라 재 작업 할 수있는 인터프리터 기본 기능을 결합하는 적어도 가능한 솔루션을 제공한다.

함수 객체를 사용하여 문제를 생각해 보면 명명 된 함수를 사용한 것처럼 함수를 직접 전달할 수도 있고 v8::FunctionTemplate::New에 전달 된 람다 식으로 중첩시킬 수도 있습니다. 하지만이 작업을 한 지 꽤 오래되었습니다.

+0

나는 그것을 알아 냈다. 그러나 어떻게해서든지 고마워한다. 코드가 도움이되었습니다. – danijar