monthly gimite

試験運用中。

[ruby][merb] MerbがRuby 1.8.7にしたら動かなくなった? (深追い編)

MerbがRuby 1.8.7にしたら動かなくなった?の続きです。

深追いしたところ原因が(だいたい)分かりました。MerbはParseTreeというライブラリを使ってるんですが、このライブラリがどうもインストール時(というより初回使用時?)のRubyのバージョンと現在のRubyのバージョンが違っていると動かないようです。なので、ParseTreeをgem installしなおしたら解決しました。*1

このバージョンの食い違いが起きているときは本来
/usr/local/lib/ruby/gems/1.8/gems/ParseTree-3.0.3/lib/parse_tree.rb:152:in `parse_tree_for_meth': bad version, 1.8.7 != 1.8.6 (fatal)
というエラーで落ちるはずなのですが、なぜかこのエラーがコンソールにもブラウザにも表示されず、単に空のレスポンスを返すという挙動になってしまっているようです。

この原因はちゃんと追ってないのですが、たとえば以下のコードでは、やはり何のメッセージも出さずにRubyが終了します(ステータスコード自体は非ゼロになってるようです)。どうも、fatal errorが何らかの例外ハンドラを通った場合に、(そのハンドラでは捕捉されないにもかかわらず)メッセージが消えてしまうようです。

require "rubygems"
require "inline"

class Hoge
  inline do |builder|
    builder.c <<-EOS
      static VALUE hoge() {
        rb_fatal("hoge");
        return Qnil;
      }
    EOS
  end
end

begin
  Hoge.new().hoge()
rescue => ex
  p ex # fatal errorは捕捉できないのでここには来ない
end
# が、fatal errorのメッセージも出ない

2009/7/26追記: Ruby 1.9.1では起こらないようです。

*1:Ruby Inlineを使っているようなので、Ruby Inlineのコンパイル結果のキャッシュみたいなものを消すだけでもいいと思うんですが、どこにあるのか分かりませんでした。