GC初期化と static initializer の問題
C++ で書かれる Scheme 関数を Environment に登録する際に、コンストラクタを利用した initializer を使っているのですがこれが GC の初期化と相性がよろしくない。
↓ initializer
void initialize##ClassName() \ { \ if (!g_gc_initialized) \ { \ scheme_gc_init(); \ g_gc_initialized = true; \ } \ procedures.add( \ ::util::Pair<Variable*, Object*>(new Variable(name), new ClassName())); \ } \ static struct Wrapper##ClassName \ { \ Wrapper##ClassName(){initialize##ClassName();} \ } initializer_##ClassName; \
GC の初期化処理が実行された後にのみ new を呼んで OK なのでいろいろと初期化の順番に気を遣わなければならない。
今までは適当なフラグを利用して
if (!g_gc_initialized) { gc_init() g_gc_initialized = true; }
などとがんばって制御していたのだけど、あまりにいびつなので、 Environment への登録をコードをスクリプトなどで生成する方法を試してみようと思う。