Defining {file,line,name} methods for each backtrace entry

 バックトレースの各行は整形済み文字列になっていますが、それを
またパースして切り出すような処理がどうにも見ていられません。
{file,line,name} のようなアクセサーを用意しませんか?

 以下はベタな実装です。

Index: vm.c

— vm.c (revision 24692)
+++ vm.c (working copy)
@@ -742,6 +742,24 @@ vm_backtrace_each(rb_thread_t *th, int l
return Qtrue;
}

+static VALUE
+rb_backtrace_trace_file(VALUE obj)
+{

  • return rb_iv_get(obj, “@file”);
    +}

+static VALUE
+rb_backtrace_trace_line(VALUE obj)
+{

  • return rb_iv_get(obj, “@line”);
    +}

+static VALUE
+rb_backtrace_trace_name(VALUE obj)
+{

  • return rb_iv_get(obj, “@name”);
    +}

static int
vm_backtrace_push(void *arg, VALUE file, int line_no, VALUE name)
{
@@ -753,6 +771,12 @@ vm_backtrace_push(void *arg, VALUE file,
}
bt = rb_enc_sprintf(rb_enc_compatible(file, name), “%s:%d:in `%s’”,
RSTRING_PTR(file), line_no, RSTRING_PTR(name));

  • rb_iv_set(bt, “@file”, file);
  • rb_iv_set(bt, “@line”, INT2FIX(line_no));
  • rb_iv_set(bt, “@name”, name);
  • rb_define_singleton_method(bt, “file”, rb_backtrace_trace_file, 0);
  • rb_define_singleton_method(bt, “line”, rb_backtrace_trace_line, 0);
  • rb_define_singleton_method(bt, “name”, rb_backtrace_trace_name, 0);
    rb_ary_push(*aryp, bt);
    return 0;
    }

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:39183] defining {file,line,name} methods for
each backtrace entry”
on Fri, 28 Aug 2009 21:04:46 +0900, “Akinori MUSHA”
[email protected] writes:

|e$B!!%P%C%/%H%l!<%9$N3F9T$O@07A:Q$_J8;zNs$K$J$C$F$$$^$9$,!“$=$l$re(B
|e$B$^$?%Q!<%9$7$F@Z$j=P$9$h$&$J=hM}$,$I$&$K$b8+$F$$$i$l$^$;$s!#e(B
|{file,line,name} e$B$N$h$&$J%”%/%;%5!<$rMQ0U$7$^$;$s$+!)e(B
|
|e$B!!0J2<$O%Y%?$J<BAu$G$9!#e(B

e$B$$$$$s$8$c$J$$$G$7$g$&$+!#<BAu$O%b%8%e!<%k$r:n$C$Fe(Bextende$B$9e(B
e$B$k$N$O$I$&$G$7$g$&!#<c43$@$,8zN($,NI$$$O$:$G$9!#e(B

At Fri, 28 Aug 2009 21:41:10 +0900,
SASADA Koichi wrote:

Yukihiro M. wrote::

| バックトレースの各行は整形済み文字列になっていますが、それを
|またパースして切り出すような処理がどうにも見ていられません。
|{file,line,name} のようなアクセサーを用意しませんか?
|
| 以下はベタな実装です。

いいんじゃないでしょうか。実装はモジュールを作ってextendす
るのはどうでしょう。若干だが効率が良いはずです。

 はい、先のパッチは効率度外視の藁人形なので、よりよい実装の話に
なるのは歓迎です。機能やメソッド名に関して異論はないでしょうか。
#name はちょっと曖昧ですが、 #method だと標準メソッドとかぶって
しまうので、4文字で揃うこともありこれでいいかなと思いました。

 backtrace は例外が発生するたびに律儀に作るので,効率の点でちょっと心配
です.文字列をパースするメソッドにするとかが対案でしょうか.

 効率を考えると、たぶん file, line, name を持ち to_str を備える
オブジェクトにするのがいい気がします。(整形は to_str まで遅延)

 私見ですが,こういうことをしたいのなら,backtrace 文字列を無理矢理拡張
ã™ã‚‹ã‚“ã˜ã‚ƒãªãã¦ï¼Œåˆ¥ã®ãƒãƒƒã‚¯ãƒˆãƒ¬ãƒ¼ã‚¹å–å¾—ã‚¤ãƒ³ã‚¿ãƒ¼ãƒ•ã‚§ãƒ¼ã‚¹ã‚’è¿½åŠ ã™ã‚‹ã»ã†ãŒ
いいような気がするんですが,どうでしょうか.

 お、具体的にはどういうインターフェースでしょうか。メソッドが
名前でなくオブジェクトで取れるとか、 binding も取れるとか…。

e$B!!$5$5$@$G$9!%e(B

Yukihiro M. wrote::

|e$B!!%P%C%/%H%l!<%9$N3F9T$O@07A:Q$_J8;zNs$K$J$C$F$$$^$9$,!"$=$l$re(B
|e$B$^$?%Q!<%9$7$F@Z$j=P$9$h$&$J=hM}$,$I$&$K$b8+$F$$$i$l$^$;$s!#e(B
|{file,line,name} e$B$N$h$&$J%"%/%;%5!<$rMQ0U$7$^$;$s$+!)e(B
|
|e$B!!0J2<$O%Y%?$J<BAu$G$9!#e(B

e$B$$$$$s$8$c$J$$$G$7$g$&$+!#<BAu$O%b%8%e!<%k$r:n$C$Fe(Bextende$B$9e(B
e$B$k$N$O$I$&$G$7$g$&!#<c43$@$,8zN($,NI$$$O$:$G$9!#e(B

e$B!!e(Bbacktrace
e$B$ONc30$,H/@8$9$k$?$S$KN’57$K:n$k$N$G!$8zN($NE@$G$A$g$C$H?4G[e(B
e$B$G$9!%J8;zNs$r%Q!<%9$9$k%a%=%C%I$K$9$k$H$+$,BP0F$G$7$g$&$+!%e(B

e$B!!;d8+$G$9$,!$$3$&$$$&$3$H$r$7$?$$$N$J$i!$e(Bbacktrace
e$BJ8;zNs$rL5M}LpM}3HD%e(B
e$B$9$k$s$8$c$J$/$F!$JL$N%P%C%/%H%l!<%9<hF@%$%s%?!<%U%’!<%9$rDI2C$9$k$[$&$,e(B
e$B$$$$$h$&$J5$$,$9$k$s$G$9$,!$$I$&$G$7$g$&$+!%e(B

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:39186] Re: defining {file,line,name} methods
for each backtrace entry”
on Fri, 28 Aug 2009 21:41:10 +0900, SASADA Koichi [email protected]
writes:

|e$B!!e(Bbacktrace e$B$ONc30$,H/@8$9$k$?$S$KN’57$K:n$k$N$G!$8zN($NE@$G$A$g$C$H?4G[e(B
|e$B$G$9!%J8;zNs$r%Q!<%9$9$k%a%=%C%I$K$9$k$H$+$,BP0F$G$7$g$&$+!%e(B

e$B$=$&$G$9$M$(!#CY1d$7$?$$$H$O;W$C$F$$$k$N$G$9$,!“$J$+$J$+LLE]e(B
e$B$J$N$GJ|CV$7$F$^$9!#$I$&$9$k$N$,$h$$$+$J$”!#e(B

|e$B!!;d8+$G$9$,!$$3$&$$$&$3$H$r$7$?$$$N$J$i!$e(Bbacktrace e$BJ8;zNs$rL5M}LpM}3HD%e(B
|e$B$9$k$s$8$c$J$/$F!$JL$N%P%C%/%H%l!<%9<hF@%$%s%?!<%U%'!<%9$rDI2C$9$k$[$&$,e(B
|e$B$$$$$h$&$J5$$,$9$k$s$G$9$,!$$I$&$G$7$g$&$+!%e(B

e$B$=$N!VJL$N%P%C%/%H%l!<%9<hF@%$%s%?!<%U%'!<%9!W$N%G%6%$%s$K$h$Ce(B
e$B$F$O%"%j$@$H;W$$$^$9!#e(B