merge revision(s) b959263b58e26ef630c085f9f7ddc04373a998c7: [Backport #21344]

Fix Exception#detailed_message for GC compaction

	Before this commit, the test fails with RGENGC_CHECK_MODE enabled:

	    TestException#test_detailed_message_under_gc_compact_stress [test/ruby/test_exception.rb:1466]:
	    <"\e[1mfoo (\e[1;4mRuntimeError\e[m\e[1m)\e[m\n" +
	    "\e[1mbar\e[m\n" +
	    "\e[1mbaz\e[m"> expected but was
	    <"\e[1mfoo (\e[1;4mRuntimeError\e[m\e[1m)\e[m\n" +
	    "\e[1m\x00\x00\x00\x00\x00\x00\x00\e[m">.
This commit is contained in:
nagachika 2025-05-18 13:32:52 +09:00
parent 74f46982eb
commit 1f226f1efe
4 changed files with 13 additions and 3 deletions

View File

@ -1662,7 +1662,7 @@ exc_detailed_message(int argc, VALUE *argv, VALUE exc)
VALUE highlight = check_highlight_keyword(opt, 0); VALUE highlight = check_highlight_keyword(opt, 0);
extern VALUE rb_decorate_message(const VALUE eclass, const VALUE emesg, int highlight); extern VALUE rb_decorate_message(const VALUE eclass, VALUE emesg, int highlight);
return rb_decorate_message(CLASS_OF(exc), rb_get_message(exc), RTEST(highlight)); return rb_decorate_message(CLASS_OF(exc), rb_get_message(exc), RTEST(highlight));
} }

View File

@ -125,7 +125,7 @@ print_errinfo(const VALUE eclass, const VALUE errat, const VALUE emesg, const VA
} }
VALUE VALUE
rb_decorate_message(const VALUE eclass, const VALUE emesg, int highlight) rb_decorate_message(const VALUE eclass, VALUE emesg, int highlight)
{ {
const char *einfo = ""; const char *einfo = "";
long elen = 0; long elen = 0;
@ -210,6 +210,8 @@ rb_decorate_message(const VALUE eclass, const VALUE emesg, int highlight)
} }
} }
RB_GC_GUARD(emesg);
return str; return str;
} }

View File

@ -1459,6 +1459,14 @@ $stderr = $stdout; raise "\x82\xa0"') do |outs, errs, status|
assert_equal("\e[1mRuntimeError (\e[1;4mRuntimeError\e[m\e[1m)\e[m", e.detailed_message(highlight: true)) assert_equal("\e[1mRuntimeError (\e[1;4mRuntimeError\e[m\e[1m)\e[m", e.detailed_message(highlight: true))
end end
def test_detailed_message_under_gc_compact_stress
EnvUtil.under_gc_compact_stress do
e = RuntimeError.new("foo\nbar\nbaz")
assert_equal("foo (RuntimeError)\nbar\nbaz", e.detailed_message)
assert_equal("\e[1mfoo (\e[1;4mRuntimeError\e[m\e[1m)\e[m\n\e[1mbar\e[m\n\e[1mbaz\e[m", e.detailed_message(highlight: true))
end
end
def test_full_message_with_custom_detailed_message def test_full_message_with_custom_detailed_message
e = RuntimeError.new("message") e = RuntimeError.new("message")
opt_ = nil opt_ = nil

View File

@ -11,7 +11,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR # define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 8 #define RUBY_VERSION_TEENY 8
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR #define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
#define RUBY_PATCHLEVEL 151 #define RUBY_PATCHLEVEL 152
#include "ruby/version.h" #include "ruby/version.h"
#include "ruby/internal/abi.h" #include "ruby/internal/abi.h"