CodePtrのインスタンスがGCに回収されない不具合と回避方法

 現状のXtal(r434以下)には、特定状況でCodePtrのインスタンスGCに回収されない不具合があります。主に以下のようなコードを書いた時に発生します。

// コンパイル
xtal::CodePtr code = xtal::compile_file("test.xtal");
// C++のクラスをバインド
code->def(Xid(hoge),xtal::cpp_class<hoge>());
// toplevel実行
code->call();

上述のコードで生成したcodeが指している実体は、

code = xtal::null;
xtal::full_gc();

などとして、CodePtrの参照を外してもGCに回収されません。
 なぜなら、


defメソッドがxtal::cpp_class() が返してくるxtal::ClassPtrインスタンスXtal上の親としてcodeを設定する

からです。

 そのため、上述のコードの用に単にcodeの参照を切るだけでは、まだ参照が残っている状態なのでGCに回収されません。
 今のところ、根本的な対策はされてませんが、回避することは出来るようになっています。
 ようは、cpp_class() から、codeへの参照を外せば良いわけですが、r433までは明示的に親を外すことはできませんでした*1。そこで、r434で新しいメソッド(object_orphanメソッド)が追加され親を外すことができるようになりました。
 よって、以下のようにすることで回避できます。

xtal::cpp_class<hoge>()->object_orphan();
code = xtal::null;
xtal::full_gc();

codeの参照を外す前後で、バインドしたcpp_class() の親も外します。
こうすることで無事codeがGCによって回収されます。

*1:set_object_parentメソッドがあるのですがxtal::nul()を渡すと落ちます