Skip to content

Commit b959263

Browse files
committed
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">.
1 parent 28ec794 commit b959263

File tree

3 files changed

+12
-2
lines changed

3 files changed

+12
-2
lines changed

error.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1662,7 +1662,7 @@ exc_detailed_message(int argc, VALUE *argv, VALUE exc)
16621662

16631663
VALUE highlight = check_highlight_keyword(opt, 0);
16641664

1665-
extern VALUE rb_decorate_message(const VALUE eclass, const VALUE emesg, int highlight);
1665+
extern VALUE rb_decorate_message(const VALUE eclass, VALUE emesg, int highlight);
16661666

16671667
return rb_decorate_message(CLASS_OF(exc), rb_get_message(exc), RTEST(highlight));
16681668
}

eval_error.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ print_errinfo(const VALUE eclass, const VALUE errat, const VALUE emesg, const VA
125125
}
126126

127127
VALUE
128-
rb_decorate_message(const VALUE eclass, const VALUE emesg, int highlight)
128+
rb_decorate_message(const VALUE eclass, VALUE emesg, int highlight)
129129
{
130130
const char *einfo = "";
131131
long elen = 0;
@@ -210,6 +210,8 @@ rb_decorate_message(const VALUE eclass, const VALUE emesg, int highlight)
210210
}
211211
}
212212

213+
RB_GC_GUARD(emesg);
214+
213215
return str;
214216
}
215217

test/ruby/test_exception.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1459,6 +1459,14 @@ def test_detailed_message
14591459
assert_equal("\e[1mRuntimeError (\e[1;4mRuntimeError\e[m\e[1m)\e[m", e.detailed_message(highlight: true))
14601460
end
14611461

1462+
def test_detailed_message_under_gc_compact_stress
1463+
EnvUtil.under_gc_compact_stress do
1464+
e = RuntimeError.new("foo\nbar\nbaz")
1465+
assert_equal("foo (RuntimeError)\nbar\nbaz", e.detailed_message)
1466+
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))
1467+
end
1468+
end
1469+
14621470
def test_full_message_with_custom_detailed_message
14631471
e = RuntimeError.new("message")
14641472
opt_ = nil

0 commit comments

Comments
 (0)