しばらく忙しくてRubyをいじってなかったが、今日はちょっと作業できた。
やったこと。
object.c (Init_Object): remove Kernel#to_a.
使うと警告が出ていたObject#to_aを削った。
eval.c: remove specialized version of rb_Array(). use simple one defined in object.c.
Object#to_aを特別扱いしていたrb_Array()の定義を削って、 object.cにあるすなおな定義(ifdef outされていた)を使うようにした。
enum.c (enum_zip): use "to_a" instead of "to_ary".
引数を配列に変換する時、to_aを使うようにした。
eval.c (proc_eq): avoid false positive by using scope and dyna_vars. no longer use frame.uniq.
空Procが違う場所なのに==が真になるケースがあった。チェック条件をより正しく。
eval.c (proc_arity): arity is now defined as number of parameters that would not be ignored. i.e. Proc.new{}.arity returns zero. update test suites too.
arityというのは「渡してもエラーにならない引数の数」のつもりだったのだが、 「無視されない(パラメータとして受けとった)引数の数」ということにした。 これにより Proc.new{}.arity は -1 でなく 0 になる。
これでRuby2に一歩(半歩)だけ近づいたな。
以前考えていたGCアルゴリズムだが、 ブロックを生成するとローカル変数から参照されているオブジェクト全部に参照マークが付いて 効率が上がらないことが判明していた。 が、リターン時にlazyにマークをつければ効率はそんなに下がらない(はず)。 いかんせん思いついたのが遅すぎた。発表申し込みの〆切は明日だ。
今回はあきらめるしかないか。