2007-12-29
Ruby 1.9.0のバイトコードをいじり倒す(その3)
|では、このVMLib::InstSeqTreeを使って、トレースを実現したいと思います。各ブロックの始まりと終わりにprintメソッドの呼び出しを追加して、ファイル名と行番号を入れるようにします。
require 'instruction' require 'pp' include VMLib iseq = VM::InstructionSequence.compile_file(ARGV[0]) iseqt = InstSeqTree.new(iseq) iseqt.add_code_before_block {|fname, info, no| [ [:putnil], [:putobject, "enter #{fname}:#{no}\n"], [:send, :print, 1, nil, 8, nil], [:pop] ] } iseqt.add_code_after_block {|fname, info, no| [ [:putnil], [:putobject, "leave #{fname}:#{no}\n"], [:send, :print, 1, nil, 8, nil], [:pop] ] } VM::InstructionSequence.load(iseqt.to_a).eval
これに、こんな感じの階乗を求めるプログラムを食わせると
def fact(n) p n if n == 0 then 1 else n * fact(n - 1) end end print fact(5)
こんな感じの出力になります。
c:\cygwin\usr\local\bin\ruby trace2.rb fact.rb enter fact.rb:1 enter fact.rb:2 5 enter fact.rb:2 4 enter fact.rb:2 3 enter fact.rb:2 2 enter fact.rb:2 1 enter fact.rb:2 0 leave fact.rb:6 leave fact.rb:6 leave fact.rb:6 leave fact.rb:6 leave fact.rb:6 leave fact.rb:6 120leave fact.rb:10
つづく
- 2 http://d.hatena.ne.jp/keyword/Ruby
- 2 http://d.hatena.ne.jp/keyworddiary/Ruby
- 2 http://reader.livedoor.com/reader/
- 1 http://atode.cc/bar.php?u=http://d.hatena.ne.jp/miura1729/20071229/1198903950&t=Ruby+1.9.0のバイトコードをいじり倒す(その1)+-+miura172
- 1 http://b.hatena.ne.jp/add?mode=confirm&title=2007-12-29 - miura1729%u306E%u65E5%u8A18&url=http://d.hatena.ne.jp/miura1729/20071229
- 1 http://b.hatena.ne.jp/add?mode=confirm&url=http://d.hatena.ne.jp/miura1729/20071229/1198903950
- 1 http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/miura1729/20071229/1198903950
- 1 http://b.hatena.ne.jp/yupo5656/favorite
- 1 http://d.hatena.ne.jp/keyworddiary/Ruby?date=20071228
- 1 http://d.hatena.ne.jp/sshi/20071226/p1