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に回収されません。
なぜなら、
からです。
そのため、上述のコードの用に単にcodeの参照を切るだけでは、まだ参照が残っている状態なのでGCに回収されません。
今のところ、根本的な対策はされてませんが、回避することは出来るようになっています。
ようは、cpp_class
よって、以下のようにすることで回避できます。
xtal::cpp_class<hoge>()->object_orphan(); code = xtal::null; xtal::full_gc();
codeの参照を外す前後で、バインドしたcpp_class
こうすることで無事codeがGCによって回収されます。