From: nobu@... Date: 2004-09-14T13:59:47+09:00 Subject: [ruby-dev:24262] Re: Array#collect! dumps core なかだです。 At Tue, 14 Sep 2004 12:39:50 +0900, Tanaka Akira wrote in [ruby-dev:24261]: > # これが最後とは思えない yieldした結果にしたがって書き換えるのは、reject!もありますね。 * array.c (rb_ary_collect_bang, rb_ary_reject_bang): end if shortened. [ruby-dev:24261] * array.c (rb_ary_equal, rb_ary_eql, rb_ary_cmp): get rid of overrunning peer array. [ruby-dev:24254] Index: array.c =================================================================== RCS file: /cvs/ruby/src/ruby/array.c,v retrieving revision 1.154 diff -u -2 -p -r1.154 array.c --- array.c 24 Jul 2004 09:48:21 -0000 1.154 +++ array.c 14 Sep 2004 04:55:03 -0000 @@ -1794,5 +1794,7 @@ rb_ary_collect_bang(ary) rb_ary_modify(ary); for (i = 0; i < RARRAY(ary)->len; i++) { - RARRAY(ary)->ptr[i] = rb_yield(RARRAY(ary)->ptr[i]); + VALUE v = rb_yield(RARRAY(ary)->ptr[i]); + if (i >= RARRAY(ary)->len) break; + RARRAY(ary)->ptr[i] = v; } return ary; @@ -2053,4 +2055,5 @@ rb_ary_reject_bang(ary) if (RTEST(rb_yield(RARRAY(ary)->ptr[i1]))) continue; if (i1 != i2) { + if (i1 >= RARRAY(ary)->len) break; RARRAY(ary)->ptr[i2] = RARRAY(ary)->ptr[i1]; } @@ -2547,4 +2550,5 @@ rb_ary_equal(ary1, ary2) if (!rb_equal(RARRAY(ary1)->ptr[i], RARRAY(ary2)->ptr[i])) return Qfalse; + if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse; } return Qtrue; @@ -2571,4 +2575,5 @@ rb_ary_eql(ary1, ary2) if (!rb_eql(RARRAY(ary1)->ptr[i], RARRAY(ary2)->ptr[i])) return Qfalse; + if (RARRAY(ary1)->len != RARRAY(ary2)->len) return Qfalse; } return Qtrue; @@ -2663,4 +2668,10 @@ rb_ary_cmp(ary1, ary2) if (v != INT2FIX(0)) { return v; + } + if (len > RARRAY(ary1)->len) { + len = RARRAY(ary1)->len; + } + if (len > RARRAY(ary2)->len) { + len = RARRAY(ary2)->len; } } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦