summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYusuke Endoh <mame@ruby-lang.org>2021-11-30 16:27:12 +0900
committerYusuke Endoh <mame@ruby-lang.org>2022-06-07 11:07:09 +0900
commit9d927204e7b86eb00bfd07a060a6383139edf741 (patch)
tree104a9f92a462773adb5d5916068fa9b00152ed9d
parentdbfb3b1917dbe89816ffeea6046d2743c32bf6b6 (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.c12
-rw-r--r--internal/string.h1
-rw-r--r--string.c2
-rw-r--r--test/ruby/test_exception.rb6
4 files changed, 18 insertions, 3 deletions
diff --git a/error.c b/error.c
index 3f5c05d681..08b0c8da72 100644
--- a/error.c
+++ b/error.c
@@ -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);
diff --git a/string.c b/string.c
index 83d90ff3a9..9c37d774b3 100644
--- a/string.c
+++ b/string.c
@@ -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