2013-01-18 41 views
0

我正在使用節點模塊,並且想從C++的ObjectWrap的子類調用它的一些方法。我不完全清楚如何在函數定義中正確構造Arguments對象。調用方法包裝爲v8的ObjectWrap從C++

舉例來說,我想調用下面的方法(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,我怎麼調用靜態的LineTo使得同一實例是從args返回的。這個調用?我當然意識到,我可以通過深入研究v8來了解這一點,但我希望有人在這個話題上有所認識可以指引我朝着正確的方向前進。

回答

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