finalizer
上述のyield問題を解決するためにした修正で、ついでにfinalizerの実装もできました。
*1
オブジェクトがgcによって削除される際、finalizeメソッドが呼ばれるようになります。
Foo: class{ finalize: method(){ "Foo::finalize!".p; } } foo: Foo(); // Fooのインスタンス生成 foo = null; // 唯一の参照元にnullを入れる full_gc(); // full gcの実行。そして「Foo::finalize!」と表示
これまでfinalizerが無かった理由は、「意外とfinalizerをgc時に呼び出す実装は難しいから」、でした。
例えば次のコードを見てください。
value: null: Foo: class{ finalize: method(){ value = this; } } Foo(); full_gc(); value.p;
単純に実装した場合、最後のvalue.pでクラッシュします。value = this; とされたら、thisは延命させないといけないのです。さらにFooが参照するオブジェクトがある場合、それも延命させなければなりません。
あまりにややこしく思ったので、xtalではサポートしない方向で居たのですが、今回頑張って無事実装できました。