diff options
author | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-04-27 12:07:43 +0000 |
---|---|---|
committer | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-04-27 12:07:43 +0000 |
commit | acde55201b35c5d1d8d08bcd4273d3adfb6115cf (patch) | |
tree | 107b6299c92cefc50928b8f86f737aa087f177a9 | |
parent | 29ca20de2d998d21c0d41224799182020311ea76 (diff) |
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/trunk@58493 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | error.c | 8 | ||||
-rw-r--r-- | internal.h | 1 | ||||
-rw-r--r-- | load.c | 5 | ||||
-rw-r--r-- | test/ruby/test_exception.rb | 4 |
4 files changed, 14 insertions, 4 deletions
@@ -268,6 +268,14 @@ rb_warning(const char *fmt, ...) } } +VALUE +rb_warning_string(const char *fmt, ...) +{ + with_warning_string(mesg, 0, fmt) { + } + return mesg; +} + #if 0 void rb_enc_warning(rb_encoding *enc, const char *fmt, ...) diff --git a/internal.h b/internal.h index 53f31b7804..cab6c8a545 100644 --- a/internal.h +++ b/internal.h @@ -1140,6 +1140,7 @@ NORETURN(void ruby_deprecated_internal_feature(const char *)); #define DEPRECATED_INTERNAL_FEATURE(func) \ (ruby_deprecated_internal_feature(func), UNREACHABLE) VALUE rb_warning_warn(VALUE mod, VALUE str); +VALUE rb_warning_string(const char *fmt, ...); /* eval.c */ VALUE rb_refinement_module_get_refined_class(VALUE module); @@ -743,8 +743,9 @@ load_lock(const char *ftptr) return (char *)""; } if (RTEST(ruby_verbose)) { - rb_warning("loading in progress, circular require considered harmful - %s", ftptr); - rb_backtrace_each(rb_warning_warn, rb_mWarning); + VALUE warning = rb_warning_string("loading in progress, circular require considered harmful - %s", ftptr); + rb_backtrace_each(rb_str_append, warning); + rb_warning_warn(rb_mWarning, warning); } switch (rb_thread_shield_wait((VALUE)data)) { case Qfalse: diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index e53569c158..db13db76d6 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -1005,9 +1005,9 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status| $LOAD_PATH.pop $LOADED_FEATURES.delete(t) end + assert_equal(1, warning.size) assert_match(/circular require/, warning.first) - warning.pop while %r[lib/rubygems/core_ext/kernel_require.rb:] =~ warning.last - assert_operator(warning.last, :start_with?, "\tfrom #{path}:1:") + assert_match(/^\tfrom #{Regexp.escape(path)}:1:/, warning.first) end def test_undefined_backtrace |