summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-10-08 15:56:01 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-10-08 15:56:01 +0000
commit21e858e518c4cec31f4c56caa37682db38bac6a3 ()
tree5f1abbb9fd29a2e0357b05037ee267e114e9a11f
parent42976d75f32c4321d602038d74be922efa4dcacd (diff)
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
-rw-r--r--ChangeLog8
-rw-r--r--internal.h1
-rw-r--r--load.c3
-rw-r--r--test/ruby/test_require.rb17
-rw-r--r--vm_backtrace.c29
5 files changed, 49 insertions, 9 deletions
@@ -1,3 +1,11 @@
Tue Oct 8 21:03:35 2013 Koichi Sasada <[email protected]>
* vm_backtrace.c, include/ruby/debug.h: add new APIs
@@ -744,6 +744,7 @@ VALUE rb_make_backtrace(void);
void rb_backtrace_print_as_bugreport(void);
int rb_backtrace_p(VALUE obj);
VALUE rb_backtrace_to_str_ary(VALUE obj);
VALUE rb_vm_backtrace_object();
RUBY_SYMBOL_EXPORT_BEGIN
@@ -706,8 +706,7 @@ load_lock(const char *ftptr)
}
if (RTEST(ruby_verbose)) {
rb_warning("loading in progress, circular require considered harmful - %s", ftptr);
- /* TODO: display to $stderr, not stderr in C */
- rb_backtrace();
}
switch (rb_thread_shield_wait((VALUE)data)) {
case Qfalse:
@@ -399,6 +399,7 @@ class TestRequire < Test::Unit::TestCase
def test_race_exception
bug5754 = '[ruby-core:41618]'
path = nil
Tempfile.create(%w"bug5754 .rb") {|tmp|
path = tmp.path
tmp.print %{\
@@ -416,12 +417,11 @@ class TestRequire < Test::Unit::TestCase
}
tmp.close
- # "circular require" warnings to $stderr, but backtraces to stderr
- # in C-level. And redirecting stderr to a pipe seems to change
- # some blocking timings and causes a deadlock, so run in a
- # separated process for the time being.
- assert_separately(["-w", "-", path, bug5754], <<-'end;', ignore_stderr: true)
- path, bug5754 = *ARGV
start = false
scratch = []
@@ -454,9 +454,12 @@ class TestRequire < Test::Unit::TestCase
assert_equal(true, (t1_res ^ t2_res), bug5754 + " t1:#{t1_res} t2:#{t2_res}")
assert_equal([:pre, :post], scratch, bug5754)
- end;
}
ensure
$".delete(path)
end
@@ -768,6 +768,35 @@ rb_backtrace(void)
vm_backtrace_print(stderr);
}
VALUE
rb_make_backtrace(void)
{