ruby-changes:14528
From: nobu <ko1@a...>
Date: Thu, 21 Jan 2010 11:12:23 +0900 (JST)
Subject: [ruby-changes:14528] Ruby:r26365 (trunk): * array.c (rb_ary_reverse_m): copy directly.
nobu 2010-01-21 11:12:07 +0900 (Thu, 21 Jan 2010) New Revision: 26365 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26365 Log: * array.c (rb_ary_reverse_m): copy directly. Modified files: trunk/ChangeLog trunk/array.c Index: array.c =================================================================== --- array.c (revision 26364) +++ array.c (revision 26365) @@ -1495,16 +1495,22 @@ return Qfalse; } -VALUE -rb_ary_dup(VALUE ary) +static VALUE +rb_ary_dup_setup(VALUE ary) { VALUE dup = rb_ary_new2(RARRAY_LEN(ary)); int is_embed = ARY_EMBED_P(dup); DUPSETUP(dup, ary); if (is_embed) FL_SET_EMBED(dup); - MEMCPY(RARRAY_PTR(dup), RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary)); ARY_SET_LEN(dup, RARRAY_LEN(ary)); + return dup; +} +VALUE +rb_ary_dup(VALUE ary) +{ + VALUE dup = rb_ary_dup_setup(ary); + MEMCPY(RARRAY_PTR(dup), RARRAY_PTR(ary), VALUE, RARRAY_LEN(ary)); return dup; } @@ -1787,7 +1793,15 @@ static VALUE rb_ary_reverse_m(VALUE ary) { - return rb_ary_reverse(rb_ary_dup(ary)); + VALUE dup = rb_ary_dup_setup(ary); + long len = RARRAY_LEN(ary); + + if (len > 0) { + VALUE *p1 = RARRAY_PTR(ary); + VALUE *p2 = RARRAY_PTR(dup) + len - 1; + do *p2-- = *p1++; while (--len > 0); + } + return dup; } struct ary_sort_data { Index: ChangeLog =================================================================== --- ChangeLog (revision 26364) +++ ChangeLog (revision 26365) @@ -1,3 +1,7 @@ +Thu Jan 21 11:12:06 2010 Nobuyoshi Nakada <nobu@r...> + + * array.c (rb_ary_reverse_m): copy directly. + Thu Jan 21 09:38:00 2010 Nobuyoshi Nakada <nobu@r...> * configure.in: use AS_CASE instead of when, to get rid of -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/