ruby: applied a bunch of patches with varying importance
[crux-ports.git] / ruby / ruby-array_shift.diff
1 diff -aur ruby-1.8.5.orig/array.c ruby-1.8.5/array.c
2 --- ruby-1.8.5.orig/array.c     2006-06-24 16:53:36.000000000 +0200
3 +++ ruby-1.8.5/array.c  2006-11-12 11:58:46.187673233 +0100
4 @@ -501,8 +501,16 @@
5      rb_ary_modify_check(ary);
6      if (RARRAY(ary)->len == 0) return Qnil;
7      top = RARRAY(ary)->ptr[0];
8 -    ary_make_shared(ary);
9 -    RARRAY(ary)->ptr++;                /* shift ptr */
10 +    if (RARRAY(ary)->len < ARY_DEFAULT_SIZE && !FL_TEST(ary, ELTS_SHARED)) {
11 +       MEMMOVE(RARRAY(ary)->ptr, RARRAY(ary)->ptr + 1, VALUE, RARRAY(ary)->len - 1);
12 +    }
13 +    else {
14 +       if (!FL_TEST(ary, ELTS_SHARED)) {
15 +           RARRAY(ary)->ptr[0] = Qnil;
16 +       }
17 +       ary_make_shared(ary);
18 +       RARRAY(ary)->ptr++;             /* shift ptr */
19 +    }
20      RARRAY(ary)->len--;
21  
22      return top;