summaryrefslogtreecommitdiff
path: root/vm_backtrace.c
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-16 15:27:37 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-02-16 15:27:37 +0000
commitac84c2aee2c576247e7961491904f909e8b9ab66 (patch)
tree787b4abcbc340d18c24471455a2102c945c598ba /vm_backtrace.c
parent4237809aa3983fca36b520f95b48fdf9e7e88de2 (diff)
merge revision(s) 58471,58493: [Backport #13505]
load.c: backtrace of circular require * load.c (load_lock): print backtrace of circular require via `Warning.warn` [ruby-core:80850] [Bug #13505] Send the backtrace of the circular require warning as a single String to Warning.warn * load.c: send as a single string. * error.c: expose the string formatted by rb_warning as rb_warning_string(). * test/ruby/test_exception.rb: update tests. [ruby-core:80850] [Bug #13505] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@62435 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_backtrace.c')
-rw-r--r--vm_backtrace.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/vm_backtrace.c b/vm_backtrace.c
index 1df7bb8b7f..b32f1e74eb 100644
--- a/vm_backtrace.c
+++ b/vm_backtrace.c
@@ -778,10 +778,15 @@ rb_backtrace(void)
vm_backtrace_print(stderr);
}
+struct print_to_arg {
+ VALUE (*iter)(VALUE recv, VALUE str);
+ VALUE output;
+};
+
static void
oldbt_print_to(void *data, VALUE file, int lineno, VALUE name)
{
- VALUE output = (VALUE)data;
+ const struct print_to_arg *arg = data;
VALUE str = rb_sprintf("\tfrom %"PRIsVALUE":%d:in ", file, lineno);
if (NIL_P(name)) {
@@ -790,16 +795,19 @@ oldbt_print_to(void *data, VALUE file, int lineno, VALUE name)
else {
rb_str_catf(str, " `%"PRIsVALUE"'\n", name);
}
- rb_io_write(output, str);
+ (*arg->iter)(arg->output, str);
}
void
-rb_backtrace_print_to(VALUE output)
+rb_backtrace_each(VALUE (*iter)(VALUE recv, VALUE str), VALUE output)
{
struct oldbt_arg arg;
+ struct print_to_arg parg;
+ parg.iter = iter;
+ parg.output = output;
arg.func = oldbt_print_to;
- arg.data = (void *)output;
+ arg.data = &parg;
backtrace_each(GET_THREAD(),
oldbt_init,
oldbt_iter_iseq,