来自C ++的v8 ObjectWrap上为JS包装的调用方法

时间:2013-01-18 20:52:54

标签: node.js v8

我正在使用节点模块,并希望在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返回相同的实例。这个调用?我当然意识到我可以通过挖掘v8来解决这个问题,但我希望有人知道这个话题可以指出我正确的方向。

1 个答案:

答案 0 :(得分: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);