From: matz@... (Yukihiro Matsumoto) Date: 2000-10-25T12:33:01+09:00 Subject: [ruby-talk:5833] Re: Array#insert rehashed Hi, In message "[ruby-talk:5830] Array#insert rehashed" on 00/10/25, Aleksi Niemel� 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); }