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というブランチを切ってそこに入っています。