0

我正在使用一个节点模块,并希望在 C++ 的 ObjectWrap 的子类上调用它的一些方法。我并不完全清楚如何在函数定义中正确构造 Arguments 对象。

例如,我想调用以下方法(Context2d extends 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,我如何调用静态 LineTo 以便从 args.This 调用返回相同的实例?我当然意识到我可以通过深入研究 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 回答