1

Node.js用のAgueas [1]アドオンを書いています

今のところ同期コードがあり、C++ クラスは次のようになります。

class LibAugeas : public node::ObjectWrap {
public:
    static void Init(Handle<Object> target);

protected:
    augeas * m_aug;
    LibAugeas();
    ~LibAugeas();

    static Handle<Value> New(const Arguments& args);

    static Handle<Value> get        (const Arguments& args);
    static Handle<Value> set        (const Arguments& args);
    static Handle<Value> setm       (const Arguments& args);
    // other methods
};

JS でのこのクラスの使用法:

var lib = require('...');
var aug = new lib.Augeas(...);
aug.set(...);
aug.get(...);
// etc

非同期コードを実装します。

ボトルネックは、すべてまたは一部のレンズとファイルのロードと解析中に augeas オブジェクト (aug_init) を作成することです。したがって、 augeas オブジェクトを非同期に作成し、作成した JS オブジェクトをコールバック関数に渡すという考え方です。

  1. 純粋な C スレッド: aug_init()、aug_load() を呼び出して augeas ハンドルを取得します。
  2. 準備ができたら、augeas ハンドルを使用して JS オブジェクトを作成します (最初のスニペットを参照)。
  3. 作成した JS オブジェクトをコールバック関数に渡します。

使用法は次のようになります。

lib.heracles(function(aug) {
        if (!aug.error()) {
            console.log('Hello!');

            // async save:
            aug.save(function(err, msg) {
                console.log(msg);
                });
        } else {
            console.log('Sad, but true :-(');
        }
    }
);

そして最後に、私の問題: C++ で JS オブジェクトを作成する方法がわかりません :-)

コンストラクターは をstatic Handle<Value> New(const Arguments& args);返しますargs.This()が、C++ コードを使用しているときは、argsオブジェクトを持っておらず、ラップすることもできません。

では、C++ で JS オブジェクトを作成するにはどうすればよいでしょうか。それが不可能だと言って私の心を壊さないでください:-)

[1] http://augeas.net

4

1 に答える 1

1

わかりました、みんなに感謝します:-)私は正しい方法を見つけました。これは、指定されたaugeasハンドルをラップするJSオブジェクトを作成する静的メソッドです。次に、このオブジェクトをC++コードからコールバック関数に渡すことができます。

Local<Object> LibAugeas::New(augeas *aug)
{
    LibAugeas *obj = new LibAugeas();
    obj->m_aug = aug;

    Handle<ObjectTemplate> tpl = ObjectTemplate::New();
    tpl->SetInternalFieldCount(1); // one field for LibAugeas* pointer (via obj->Wrap())

#define _OBJ_NEW_METHOD(m) NODE_SET_METHOD(tpl, #m, m)
    _OBJ_NEW_METHOD(get);
    _OBJ_NEW_METHOD(set);
    _OBJ_NEW_METHOD(setm);
    _OBJ_NEW_METHOD(rm);
    _OBJ_NEW_METHOD(mv);
    _OBJ_NEW_METHOD(save);
    _OBJ_NEW_METHOD(nmatch);
    _OBJ_NEW_METHOD(insert);
    _OBJ_NEW_METHOD(error);

    Local<Object> O = tpl->NewInstance();
    obj->Wrap(O);
    return O;
}
于 2012-04-24T17:38:59.147 に答える