0

JavaScript V8を使い始めたばかりで、 Embedder's Guideから基本的な例をコンパイルしました。次に、C++ 関数を JavaScript コンテキストにバインドします。

今のところ、後でバインドを処理する必要がある、多かれ少なかれ空のクラスしかありません。

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;
};

std::functionオブジェクトを JavaScript V8 コンテキストにバインドするにはどうすればよいですか?

4

2 に答える 2

3

エンジンで使用したのは、かなり複雑なアプローチでしたが、最初に思いついたものです。(悲しいことに、V8 から LLVM に移行したため、これを最適化していませんでした。)

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。しかし、私がこれを使ってからかなりの時間が経ちました。

于 2013-03-31T20:24:11.220 に答える