ruby-changes:73707
From: Yusuke <ko1@a...>
Date: Fri, 23 Sep 2022 16:42:02 +0900 (JST)
Subject: [ruby-changes:73707] a78c733cc3 (master): Revert "Revert "error.c: Let Exception#inspect inspect its message""
https://git.ruby-lang.org/ruby.git/commit/?id=a78c733cc3 From a78c733cc32cc3da3796cbf65da21cdd40c63230 Mon Sep 17 00:00:00 2001 From: Yusuke Endoh <mame@r...> Date: Fri, 23 Sep 2022 16:40:59 +0900 Subject: Revert "Revert "error.c: Let Exception#inspect inspect its message"" This reverts commit b9f030954a8a1572032f3548b39c5b8ac35792ce. [Bug #18170] --- error.c | 12 ++++++++++-- internal/string.h | 1 + string.c | 2 +- test/ruby/test_exception.rb | 6 ++++++ 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/error.c b/error.c index 113264eeb7..cfa086a1eb 100644 --- a/error.c +++ b/error.c @@ -34,6 +34,7 @@ https://github.com/ruby/ruby/blob/trunk/error.c#L34 #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" @@ -1439,8 +1440,15 @@ exc_inspect(VALUE exc) https://github.com/ruby/ruby/blob/trunk/error.c#L1440 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 46862d77f5..43b716f9b2 100644 --- a/internal/string.h +++ b/internal/string.h @@ -44,6 +44,7 @@ const char *ruby_escaped_char(int c); https://github.com/ruby/ruby/blob/trunk/internal/string.h#L44 void rb_str_make_independent(VALUE str); int rb_enc_str_coderange_scan(VALUE str, rb_encoding *enc); int rb_ascii8bit_appendable_encoding_index(rb_encoding *enc, unsigned int code); +VALUE rb_str_include(VALUE str, VALUE arg); static inline bool STR_EMBED_P(VALUE str); static inline bool STR_SHARED_P(VALUE str); diff --git a/string.c b/string.c index ac0a2acb11..c5711bcfe3 100644 --- a/string.c +++ b/string.c @@ -6456,7 +6456,7 @@ rb_str_reverse_bang(VALUE str) https://github.com/ruby/ruby/blob/trunk/string.c#L6456 * */ -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 f041067137..b87cef3fb6 100644 --- a/test/ruby/test_exception.rb +++ b/test/ruby/test_exception.rb @@ -478,6 +478,12 @@ end.join https://github.com/ruby/ruby/blob/trunk/test/ruby/test_exception.rb#L478 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 -- cgit v1.2.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/