summaryrefslogtreecommitdiff
path: root/array.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-21 02:12:07 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-21 02:12:07 +0000
commit2cb9f63bab44a99a8fe58c9005cd65af9c91ce1d (patch)
treeb1eca5de8fffcbb10f3a1638322640b8e1cc3ef0 /array.c
parentbb8f1415e840c0de26a3aa693cb885598d429649 (diff)
* array.c (rb_ary_reverse_m): copy directly.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26365 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'array.c')
-rw-r--r--array.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/array.c b/array.c
index c4cd30cd63..ab89f5f30f 100644
--- a/array.c
+++ b/array.c
@@ -1495,16 +1495,22 @@ rb_ary_empty_p(VALUE ary)
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 @@ rb_ary_reverse_bang(VALUE ary)
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 {