0

私はノード モジュールを使用しており、C++ から ObjectWrap のサブクラスでそのメソッドのいくつかを呼び出したいと考えています。関数定義で Arguments オブジェクトを正しく構築する方法は、私には完全には明らかではありません。

たとえば、次のメソッドを呼び出したいと思います (Context2d は ObjectWrap を拡張します)。

Handle<Value>
Context2d::LineTo(const Arguments &args) {
    HandleScope scope;

    if (!args[0]->IsNumber()) 
        return ThrowException(Exception::TypeError(String::New("lineTo() x must be a number")));
    if (!args[1]->IsNumber()) 
        return ThrowException(Exception::TypeError(String::New("lineTo() y must be a number")));

    Context2d *context = ObjectWrap::Unwrap<Context2d>(args.This());
    cairo_line_to(context->context(), args[0]->NumberValue(), args[1]->NumberValue()); 

    return Undefined();
}

つまり、簡潔に言うと、ラップされていない Context2D がある場合、args.This 呼び出しから同じインスタンスが返されるように静的 LineTo を呼び出すにはどうすればよいでしょうか? もちろん、v8を掘り下げることでこれを理解できることはわかっていますが、このトピックに精通している誰かが私を正しい方向に向けてくれることを望んでいました.

4

1 に答える 1

0

このようなもので呼び出すことができるはずです。関数がオブジェクト上にあると仮定してtoLineいます。オブジェクトのプロトタイプ構造を示していないため、これを調整して一致させる必要があります。

int x = 10;
int y = 20;
Context2D *context = ...;

// Get a reference to the function from the object.
Local<Value> toLineVal = context->handle_->Get(String::NewSymbol("toLine"));
if (!toLineVal->IsFunction()) return; // Error, toLine was replaced somehow.

// Cast the generic reference to a function.
Local<Function> toLine = Local<Function>::Cast(toLineVal);

// Call the function with two integer arguments.
Local<Value> args[2] = {
  Integer::New(x),
  Integer::New(y)
};
toLine->Call(context->handle_, 2, args);

これは、このJSと同等である必要があります。

var toLineVal = context.toLine;
if (typeof toLineVal !== 'function') return; // Error

toLineVal(10, 20);
于 2013-01-19T05:16:34.660 に答える