------art_24524_3915188.1159197873439
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

This change

Mon Sep 25 21:24:54 2006  Yukihiro Matsumoto  <matz / ruby-lang.org>

    * array.c (rb_ary_shift): should clear shifting top element.
      [ruby-talk:216055]

    * array.c (rb_ary_shift): avoid creating shared object if array
      size is small.

leads to

irb(main):027:0> a  :a] * 3
[:a, :a, :a]
irb(main):028:0> a
[:a, :a, :a]
irb(main):029:0> a.dup.shift
:a
irb(main):030:0> a
[:a, :a, true]


This patch seems to fix it

Index: array.c
RCS file: /src/ruby/array.c,v
retrieving revision 1.137.2.34
diff -u -r1.137.2.34 array.c
--- array.c    24 Sep 2006 23:16:53 -0000    1.137.2.34
+++ array.c    25 Sep 2006 15:23:20 -0000
@@ -501,7 +501,7 @@
     rb_ary_modify_check(ary);
     if (RARRAY(ary)->len 0) return Qnil;
     top  ARRAY(ary)->ptr[0];
-    if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
+    if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE && !FL_TEST(ary, ELTS_SHARED)) {
     MEMMOVE(RARRAY_PTR(ary), RARRAY_PTR(ary)+1, VALUE, RARRAY_LEN(ary));
     }
     else {


-- 
Kent
---
http://www.datanoise.com

------art_24524_3915188.1159197873439--