[ruby-dev:24262] Re: Array#collect! dumps core

From: nobu@...
Date: 2004-09-14 04:59:47 UTC
List: ruby-dev #24262
なかだです。

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はできる。
    中田 伸悦

In This Thread