diff options
author | Yusuke Endoh <mame@ruby-lang.org> | 2021-11-30 16:27:12 +0900 |
---|---|---|
committer | Yusuke Endoh <mame@ruby-lang.org> | 2022-06-07 11:07:09 +0900 |
commit | 9d927204e7b86eb00bfd07a060a6383139edf741 (patch) | |
tree | 104a9f92a462773adb5d5916068fa9b00152ed9d | |
parent | dbfb3b1917dbe89816ffeea6046d2743c32bf6b6 (diff) |
error.c: Let Exception#inspect inspect its message
... only when the message string has a newline.
`p StandardError.new("foo\nbar")` now prints `#<StandardError: "foo\nbar">'
instead of:
#<StandardError:
bar>
[Bug #18170]
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/4857
-rw-r--r-- | error.c | 12 | ||||
-rw-r--r-- | internal/string.h | 1 | ||||
-rw-r--r-- | string.c | 2 | ||||
-rw-r--r-- | test/ruby/test_exception.rb | 6 |
4 files changed, 18 insertions, 3 deletions
@@ -34,6 +34,7 @@ #include "internal/io.h" #include "internal/load.h" #include "internal/object.h" +#include "internal/string.h" #include "internal/symbol.h" #include "internal/thread.h" #include "internal/variable.h" @@ -1422,8 +1423,15 @@ exc_inspect(VALUE exc) str = rb_str_buf_new2("#<"); klass = rb_class_name(klass); rb_str_buf_append(str, klass); - rb_str_buf_cat(str, ": ", 2); - rb_str_buf_append(str, exc); + + if (RTEST(rb_str_include(exc, rb_str_new2("\n")))) { + rb_str_catf(str, ":%+"PRIsVALUE, exc); + } + else { + rb_str_buf_cat(str, ": ", 2); + rb_str_buf_append(str, exc); + } + rb_str_buf_cat(str, ">", 1); return str; diff --git a/internal/string.h b/internal/string.h index 18b01862f7..57a4af49c7 100644 --- a/internal/string.h +++ b/internal/string.h @@ -43,6 +43,7 @@ char *rb_str_to_cstr(VALUE str); const char *ruby_escaped_char(int c); void rb_str_make_independent(VALUE str); int rb_enc_str_coderange_scan(VALUE str, rb_encoding *enc); +VALUE rb_str_include(VALUE str, VALUE arg); static inline bool STR_EMBED_P(VALUE str); static inline bool STR_SHARED_P(VALUE str); @@ -6376,7 +6376,7 @@ rb_str_reverse_bang(VALUE str) * */ -static VALUE +VALUE rb_str_include(VALUE str, VALUE arg) { long i; diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb index 0b05ff7c51..acc3228e2f 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -478,6 +478,12 @@ end.join def to_s; ""; end end assert_equal(e.inspect, e.new.inspect) + + # https://bugs.ruby-lang.org/issues/18170#note-13 + assert_equal('#<Exception:"foo\nbar">', Exception.new("foo\nbar").inspect) + assert_equal('#<Exception: foo bar>', Exception.new("foo bar").inspect) + assert_equal('#<Exception: foo\bar>', Exception.new("foo\\bar").inspect) + assert_equal('#<Exception: "foo\nbar">', Exception.new('"foo\nbar"').inspect) end def test_to_s |