2012-03-11

Node.jsのモジュールをC++で書く (引数と戻り値)

引き続きv8.hを読みながらNodeモジュールを書く練習をする。

モジュールのメソッド定義ですが、名前の通りv8::Argumentsが引数の表現で、[]オペレータでアクセスするとv8::Value型のそれぞれの引数が得られる。型チェックはIsNumberやらIsStringといったメソッドはあっても、型を直接返してくれる物は無いのでやや面倒。

試しに、こんなモジュールを作ってみる。
#include <node.h>
#include <v8.h>
#include <iostream>

using namespace v8;

// 引数の数と、それぞれの型をチェックするメソッド
Handle<Value> ArgumentTest(const Arguments& args) {
    HandleScope scope;
    for (int i = 0; i < args.Length(); i++) {
        if (args[i]->IsString()) {
            std::cout << "String!!" << std::endl;
        } else if (args[i]->IsFunction()) {
            std::cout << "Function!!" << std::endl;
        } else if (args[i]->IsObject()) {
            std::cout << "Object!!" << std::endl;
        } else {
            // Number or Boolean or Date ... etc
        }
    }
    return scope.Close(v8::Number::New(args.Length()));
}

// 第一引数をそのままreturnするメソッド
Handle<Value> ReturnTest(const Arguments& args) {
    HandleScope scope;
    return scope.Close(args[0]);    
}

// メソッドのexport定義
void init(Handle<Object> target) {
    target->Set(String::NewSymbol("argumentTest"), FunctionTemplate::New(ArgumentTest)->GetFunction());
    target->Set(String::NewSymbol("returnTest"), FunctionTemplate::New(ReturnTest)->GetFunction());
}

NODE_MODULE(Test1, init)

呼び出し側のコード
var Test1 = require('./build/Release/Test1');

console.log("Check arguments...");
var result = Test1.argumentTest("str", function(){}, {hoge:100});
console.log(result + ' arguments passed');

console.log("");
console.log("Check return value type");
console.log(typeof(Test1.returnTest("str")));
console.log(typeof(Test1.returnTest(100)));
console.log(typeof(Test1.returnTest(new Date())));
console.log(typeof(Test1.returnTest(function(){})));

実行結果
Check arguments...
String!!
Function!!
Object!!
3 arguments passed

Check return value type
string
number
object
function


クラスメソッドしか持たないモジュールはこの書き方がわかれば作れそう。あと、コードを書く時はIDEの支援が欲しいので、Xcodeでソース開いてv8とnodeのコードをヘッダ検索パスに追加した状態で作業した方が楽できますね。

f:id:hagino_3000:20120311024001p:image

続きます

Node.jsのモジュールをC++で書く (ObjectとArrayを受け取るメソッド)
http://d.hatena.ne.jp/hagino_3000/20120320/1332228809





このエントリーをはてなブックマークに追加