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);
}