From 21e858e518c4cec31f4c56caa37682db38bac6a3 Mon Sep 17 00:00:00 2001 From: nobu Date: Tue, 8 Oct 2013 15:56:01 +0000 Subject: load.c: display backtrace to $stderr * load.c (load_lock): display backtrace to $stderr at circular require. * vm_backtrace.c (rb_backtrace_print_to): new function to print backtrace to the given output. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43204 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_backtrace.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'vm_backtrace.c') diff --git a/vm_backtrace.c b/vm_backtrace.c index 8155c85856..1f2e8c3f19 100644 --- a/vm_backtrace.c +++ b/vm_backtrace.c @@ -768,6 +768,35 @@ rb_backtrace(void) vm_backtrace_print(stderr); } +static void +oldbt_print_to(void *data, VALUE file, int lineno, VALUE name) +{ + VALUE output = (VALUE)data; + VALUE str = rb_sprintf("\tfrom %"PRIsVALUE":%d:in ", file, lineno); + + if (NIL_P(name)) { + rb_str_cat2(str, "unknown method\n"); + } + else { + rb_str_catf(str, " `%"PRIsVALUE"'\n", name); + } + rb_io_write(output, str); +} + +void +rb_backtrace_print_to(VALUE output) +{ + struct oldbt_arg arg; + + arg.func = oldbt_print_to; + arg.data = (void *)output; + backtrace_each(GET_THREAD(), + oldbt_init, + oldbt_iter_iseq, + oldbt_iter_cfunc, + &arg); +} + VALUE rb_make_backtrace(void) { -- cgit v1.2.3