From: Yusuke ENDOH Date: 2008-09-24T12:38:48+09:00 Subject: [ruby-core:18835] Re: miniunit added Hi, 2008/9/24 SASADA Koichi : > I modified mini/test.rb. > > http://www.atdot.net/sp/readonly/fnco7k > delay message creation. how about it? > > SASADA Koichi wrote: >> I got it. >> >> SASADA Koichi wrote: >>>> TestMarshal#test_range_cyclic: make: *** [test-all] Segmentation fault >>>> >>>> I want to get a backtrace for debugging. miniunit closes stderr? >>> It's seems double fault. So Ruby's issue. >> >> mini/test make message before doing test. >> >>> def assert_same exp, act, msg = nil >>> msg = message msg, "Expected #{mu_pp(act)} to be the same as #{mu_pp(exp)}" >>> assert exp.equal?(act), msg >>> end >> >> However, TestMarshal#test_range_cyclic passes cyclic object. To >> build assert message, inspect cause infinite call (stack overflow). I have no idea whether miniunit should delay message creation. But at least I think that that SEGV is a bug of Range#inspect and should be fixed. Index: range.c =================================================================== --- range.c (revision 19507) +++ range.c (working copy) @@ -663,6 +663,24 @@ return str; } +static VALUE +inspect_range(VALUE range, VALUE dummy, int recur) +{ + VALUE str, str2; + + if (recur) { + return rb_str_new2(EXCL(range) ? "(... ... ...)" : "(... .. ...)"); + } + str = rb_inspect(RANGE_BEG(range)); + str2 = rb_inspect(RANGE_END(range)); + str = rb_str_dup(str); + rb_str_cat(str, "...", EXCL(range) ? 3 : 2); + rb_str_append(str, str2); + OBJ_INFECT(str, str2); + + return str; +} + /* * call-seq: * rng.inspect => string @@ -676,16 +694,7 @@ static VALUE range_inspect(VALUE range) { - VALUE str, str2; - - str = rb_inspect(RANGE_BEG(range)); - str2 = rb_inspect(RANGE_END(range)); - str = rb_str_dup(str); - rb_str_cat(str, "...", EXCL(range) ? 3 : 2); - rb_str_append(str, str2); - OBJ_INFECT(str, str2); - - return str; + return rb_exec_recursive(inspect_range, range, 0); } /* -- Yusuke ENDOH