久しぶりの大きな変更
yarv2llvmを使っていたらバグに遭遇してしまいました。エンバグで勉強会のデモが動かなくなるのが怖くて躊躇したのですが、あまりにもひどいバグなので直しました。
バグの内容はRuby1.9のソースに入っている、benchmark/bm_vm2_poly_method.rbがまだ多態メソッドコールを作っていないのにコンパイルできてしまうというものです。デモには関係ないのですが、こんなバグがあるような状態だと話に説得力が無いので取れてよかったです。
benchmark/bm_vm2_poly_method.rbは次のようなプログラムです。
class C1 def m 1 end end class C2 def m 2 end end o1 = C1.new o2 = C2.new i=0 while i<6000000 # benchmark loop 2 o = (i % 2 == 0) ? o1 : o2 o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m i+=1 end
これまで、oの型がC1であると推論されていました。C1とC2が型衝突しているという情報がうまく記録されていないのと、メソッドコールのコンパイル時に型衝突の情報を使っていなかったのが原因です。
とりあえず、この例ではちゃんとエラーになるようになりました。後は、エンバグが無ければいいのですが・・・。