From: "NAKAMURA, Hiroshi" Date: 2002-11-13T10:43:39+09:00 Subject: [ruby-dev:18757] klass == 0 as ruby_top_self in call_trace_func なひです。 トップレベルではruby_frame->last_classが0になっているため、 call_trace_funcから呼び出されるtrace_funcのklassが0 => false になります。 $ cat top.rb set_trace_func proc { |*arg| p arg[5] } true $ ruby17 -v top.rb ruby 1.7.3 (2002-11-07) [i386-cygwin] top.rb:2: warning: useless use of true in void context false eval.cのほかのところを見ると、ruby_frame->last_class == 0 はtop levelと仮定できるように見えたのですが、これが正しければ、 call_trace_funcを末尾のpatchのように変更したいです。 その結果こうなります。 $ cat top.rb set_trace_func proc { |*arg| p arg[5] } true $ ruby17 -v top.rb ruby 1.7.3 (2002-11-07) [i386-cygwin] top.rb:2: warning: useless use of true in void context main どうでしょう。 $ diff -u2p eval.c.prev eval.c --- eval.c.prev 2002-11-13 09:14:06.000000000 +0900 +++ eval.c 2002-11-13 10:25:16.000000000 +0900 @@ -2105,11 +2105,10 @@ call_trace_func(event, node, self, id, k ruby_sourceline = nd_line(node); } - if (klass) { - if (TYPE(klass) == T_ICLASS) { - klass = RBASIC(klass)->klass; - } - else if (FL_TEST(klass, FL_SINGLETON)) { - klass = self; - } + if (!klass) klass = ruby_top_self; + if (TYPE(klass) == T_ICLASS) { + klass = RBASIC(klass)->klass; + } + else if (FL_TEST(klass, FL_SINGLETON)) { + klass = self; } PUSH_TAG(PROT_NONE);