XTAL_PREBIND

XTAL_PREBIND(ClassName);

Xtal環境にC++クラスの継承構造やコンストラクタをバインドします。このマクロでバインドしただけではXtalから使うことは出来ず、filelocalやglobal、libといった領域にcpp_class<T>を使ってクラスオブジェクトを定義する必要があります。

実際に内容が実行されるタイミングはXtalの初期化時です。

Xtalに渡すクラスは全てこれを使って登録する必要があり、そうしないと予期せぬ動作をして落ちたりします。

Example

C++

class Foo{
public:
    Foo(){
        StringPtr("foo constructed")->p();
    }
 
    void print(){
        StringPtr("foo")->p();
    }
};
 
XTAL_PREBIND(Foo){
    Xdef_ctor0();
}
 
void exec_xtal(){
    xtal::global()->def(Xid(Foo), xtal::cpp_class<Foo>());
    Xsrc((
            foo : Foo();
            foo.p;
    ))->call();
}

Output

foo constructed
<(instance of lib::builtin::global::Foo)>

Notice

実装詳細に依存している注意点ですが、同じクラスのXTAL_PREBINDとXTAL_BINDは 同一翻訳単位上で順番に、かつ、混在無しに書く必要があります。

つまり、

// foo.hpp
class Foo{};
// bar.hpp
class Bar{};

が存在し、FooとBarをバインドしたい場合には、

XTAL_PREBIND(Foo){}
XTAL_BIND(Foo){}
XTAL_PREBIND(Bar){}
XTAL_BIND(Bar){}

という順番を崩さずそれぞれ連続して書く必要があります。

XTAL_[PRE]BINDの中身をグローバル静的変数の構築を使って起動時にXtal処理系に登録している関係で、このような仕様となっています。

reference/xtal_prebind.txt · 最終更新: 2012/03/22 22:14 by sukai
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0