From: Akinori MUSHA Date: 2009-08-28T21:04:46+09:00 Subject: [ruby-dev:39183] defining {file,line,name} methods for each backtrace entry --pgp-sign-Multipart_Fri_Aug_28_21:03:53_2009-1 Content-Type: text/plain; charset=ISO-2022-JP  バックトレースの各行は整形済み文字列になっていますが、それを またパースして切り出すような処理がどうにも見ていられません。 {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; } -- Akinori MUSHA / http://akinori.org/ --pgp-sign-Multipart_Fri_Aug_28_21:03:53_2009-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEABECAAYFAkqXx6kACgkQkgvvx5/Z4e7JYwCgzqMFEniCpdi4jfgsL7OYveAU /eYAnjWjQjCzeb434A3Pwo9g0MHnhzAR =pg1k -----END PGP SIGNATURE----- --pgp-sign-Multipart_Fri_Aug_28_21:03:53_2009-1--