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ではサポートしない方向で居たのですが、今回頑張って無事実装できました。

*1:これまでは、C++レベルでのみfinalizerは存在していました。