set_trace_func について

ruby 1.9 での話。
proc や lambda などの意味の違いはしばしば話題になってるのを見かけますが、僕はやっぱりさっぱりわかってません (そしてろくにわかろうともしていない) 。とりあえず挙動が異なる例を一組見つけました。

$ ./ruby -e 'set_trace_func(proc { })'
$ ./ruby -e 'set_trace_func(lambda { })'
: -- control frame ----------
c:0001 p:---- s:0001 b:-001 l:000000 d:000000 ------
---------------------------
-- backtrace of native function call (Use addr2line) --
0x80d9a55
0x80f2990
0x80b2740
0xffffe420
0x805f0d0
0x80daf65
0x80dc2e9
0x80dc337
0x80d8c27
0x805997f
0x8059e36
0x805a9cc
0x805cc20
0x805d1ec
0x805d589
0x805d6d1
0x805d721
0x8056d7f
0xb7da0ea8
0x8056cb1
-------------------------------------------------------
[BUG] Segmentation fault
ruby 1.9.0 (2007-06-21) [i686-linux]

アボートしました

set_trace_func がブロックでなく Proc オブジェクトを受け取るのは、何か深ーい事情があるのかなぁ。それとも単に使いにくくしてるだけ?
それにしても set_trace_func はパカスカ落ちますね。最近変更でもあったのかな。落ちる理由は全部同じ?(自分で追う気無し)

$ ./ruby -e 'set_trace_func(proc { throw :tag })'
(略)
[BUG] Segmentation fault
ruby 1.9.0 (2007-06-21) [i686-linux]

アボートしました
$ ./ruby -e 'set_trace_func(proc { redo })'
(略)
[BUG] Segmentation fault
ruby 1.9.0 (2007-06-21) [i686-linux]

アボートしました
$ ./ruby -e 'set_trace_func(proc { f = Fiber.new { } }); f.yield'
(略)
[BUG] Segmentation fault
ruby 1.9.0 (2007-06-21) [i686-linux]

アボートしました
$ ./ruby -e 'set_trace_func(proc { c = callcc {|c| c } }); c.call'
(略)
[BUG] Segmentation fault
ruby 1.9.0 (2007-06-21) [i686-linux]

アボートしました
$ ./ruby -e 'set_trace_func(proc { t = Thread.new { } }); t.join'
(略)
[BUG] Segmentation fault
ruby 1.9.0 (2007-06-21) [i686-linux]

アボートしました
$ ./ruby -e 'set_trace_func(proc { q = proc { } }); q.call'
(略)
[BUG] Segmentation fault
ruby 1.9.0 (2007-06-21) [i686-linux]

アボートしました