我正在使用节点模块,并希望在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来解决这个问题,但我希望有人知道这个话题可以指出我正确的方向。
答案 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);