X-Git-Url: http://git.code-monkey.de/?p=crux-ports.git;a=blobdiff_plain;f=ruby%2Fruby-array_shift.diff;fp=ruby%2Fruby-array_shift.diff;h=3d75248869e40fc51e2630cb739e20becb128312;hp=0000000000000000000000000000000000000000;hb=bc3cc75a1a931777bbfb63993d52f5ef9ecbf3a1;hpb=b50c26b7f5a1742e42a42ef6811570297285c5b6 diff --git a/ruby/ruby-array_shift.diff b/ruby/ruby-array_shift.diff new file mode 100644 index 0000000..3d75248 --- /dev/null +++ b/ruby/ruby-array_shift.diff @@ -0,0 +1,22 @@ +diff -aur ruby-1.8.5.orig/array.c ruby-1.8.5/array.c +--- ruby-1.8.5.orig/array.c 2006-06-24 16:53:36.000000000 +0200 ++++ ruby-1.8.5/array.c 2006-11-12 11:58:46.187673233 +0100 +@@ -501,8 +501,16 @@ + rb_ary_modify_check(ary); + if (RARRAY(ary)->len == 0) return Qnil; + top = RARRAY(ary)->ptr[0]; +- ary_make_shared(ary); +- RARRAY(ary)->ptr++; /* shift ptr */ ++ if (RARRAY(ary)->len < ARY_DEFAULT_SIZE && !FL_TEST(ary, ELTS_SHARED)) { ++ MEMMOVE(RARRAY(ary)->ptr, RARRAY(ary)->ptr + 1, VALUE, RARRAY(ary)->len - 1); ++ } ++ else { ++ if (!FL_TEST(ary, ELTS_SHARED)) { ++ RARRAY(ary)->ptr[0] = Qnil; ++ } ++ ary_make_shared(ary); ++ RARRAY(ary)->ptr++; /* shift ptr */ ++ } + RARRAY(ary)->len--; + + return top;