trace_funcを実装しました

yarv2llvmをスピードアップするにはprofilerがいるなーと思い、set_trace_func相当のものを作りました。set_trace_funcのそのままだとtrace_funcが設定されているかどうかを静的にチェックするのが面倒そうなので、YARV2LLVM#trace_funcというメソッドがあれば、それをYARVのtrace命令のタイミングで呼ぶようにしました。

    YARV2LLVM::compile(<<-EOS, {})
module YARV2LLVM
  def trace_func(event, line)
    p line
  end
end

def fib(n)
  if n < 2 then
    1
  else
    fib(n - 1) + fib(n - 2)
  end
end
EOS

こんな感じでコンパイルしておいて、fib(3)とすると、

9
10
13
9
10
13
9
10
11
9
9
10
11
9
9
9
10
11
9
9

こんな感じで実行したメソッドの行番号が表示されます。trace_funcはllvmオプティマイザーでインライン化されますのでオーバヘッドがかなり小さくなりそうです。今のところ、この機能はprofileというブランチを切ってそこに入っています。