Hi,

In message "[ruby-talk:5830] Array#insert rehashed"
    on 00/10/25, Aleksi Niemel<aleksi.niemela / cinnober.com> writes:

|As I pursued for the Array#insert some time ago, I happened to find this
|"feature":
|
|  $ ruby -v -e'a=[1,2,3]; a[1,0]=a; p a;'
|  ruby 1.6.2 (2000-10-16) [i686-linux]
|  [1, 1, 1, 1, 1, 1]

This and [ruby-talk:5831] are caused by a bug.

--- array.c	2000/10/10 07:03:15	1.30
+++ array.c	2000/10/25 03:32:48
@@ -533,2 +533,4 @@
 {
+    int rlen;
+
     if (len < 0) rb_raise(rb_eIndexError, "negative length %d", len);
@@ -551,2 +553,3 @@
     }
+    rlen = RARRAY(rpl)->len;
 
@@ -554,3 +557,3 @@
     if (beg >= RARRAY(ary)->len) {
-	len = beg + RARRAY(rpl)->len;
+	len = beg + rlen;
 	if (len >= RARRAY(ary)->capa) {
@@ -560,3 +563,3 @@
 	rb_mem_clear(RARRAY(ary)->ptr+RARRAY(ary)->len, beg-RARRAY(ary)->len);
-	MEMCPY(RARRAY(ary)->ptr+beg, RARRAY(rpl)->ptr, VALUE, RARRAY(rpl)->len);
+	MEMCPY(RARRAY(ary)->ptr+beg, RARRAY(rpl)->ptr, VALUE, rlen);
 	RARRAY(ary)->len = len;
@@ -570,3 +573,3 @@
 
-	alen = RARRAY(ary)->len + RARRAY(rpl)->len - len;
+	alen = RARRAY(ary)->len + rlen - len;
 	if (alen >= RARRAY(ary)->capa) {
@@ -577,3 +580,3 @@
 	if (len != RARRAY(rpl)->len) {
-	    MEMMOVE(RARRAY(ary)->ptr+beg+RARRAY(rpl)->len, RARRAY(ary)->ptr+beg+len,
+	    MEMMOVE(RARRAY(ary)->ptr+beg+rlen, RARRAY(ary)->ptr+beg+len,
 		    VALUE, RARRAY(ary)->len-(beg+len));
@@ -581,3 +584,3 @@
 	}
-	MEMCPY(RARRAY(ary)->ptr+beg, RARRAY(rpl)->ptr, VALUE, RARRAY(rpl)->len);
+	MEMMOVE(RARRAY(ary)->ptr+beg, RARRAY(rpl)->ptr, VALUE, rlen);
     }