久しぶりの大きな変更

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が型衝突しているという情報がうまく記録されていないのと、メソッドコールのコンパイル時に型衝突の情報を使っていなかったのが原因です。
とりあえず、この例ではちゃんとエラーになるようになりました。後は、エンバグが無ければいいのですが・・・。