[前][次][番号順一覧][スレッド一覧]

ruby-changes:71261

From: Peter <ko1@a...>
Date: Wed, 23 Feb 2022 23:13:27 +0900 (JST)
Subject: [ruby-changes:71261] 651b2e5959 (master): Use rb_ary_behead for rb_ary_shift

https://git.ruby-lang.org/ruby.git/commit/?id=651b2e5959

From 651b2e59598427edd0ec3ceb3a0a49b5e106a145 Mon Sep 17 00:00:00 2001
From: Peter Zhu <peter@p...>
Date: Tue, 22 Feb 2022 11:16:25 -0500
Subject: Use rb_ary_behead for rb_ary_shift

rb_ary_shift is just a special case of rb_ary_behead where we behead
only 1 element.
---
 array.c | 83 ++++++++++++++++++++++-------------------------------------------
 1 file changed, 28 insertions(+), 55 deletions(-)

diff --git a/array.c b/array.c
index a7d635eff7..1895b232ac 100644
--- a/array.c
+++ b/array.c
@@ -1422,30 +1422,14 @@ rb_ary_shift(VALUE ary) https://github.com/ruby/ruby/blob/trunk/array.c#L1422
     VALUE top;
     long len = RARRAY_LEN(ary);
 
-    rb_ary_modify_check(ary);
-    if (len == 0) return Qnil;
-    top = RARRAY_AREF(ary, 0);
-    if (!ARY_SHARED_P(ary)) {
-	if (len < ARY_DEFAULT_SIZE) {
-            RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
-		MEMMOVE(ptr, ptr+1, VALUE, len-1);
-	    }); /* WB: no new reference */
-            ARY_INCREASE_LEN(ary, -1);
-            ary_verify(ary);
-	    return top;
-	}
-        assert(!ARY_EMBED_P(ary)); /* ARY_EMBED_LEN_MAX < ARY_DEFAULT_SIZE */
-
-	ARY_SET(ary, 0, Qnil);
-	ary_make_shared(ary);
-    }
-    else if (ARY_SHARED_ROOT_OCCUPIED(ARY_SHARED_ROOT(ary))) {
-        RARRAY_PTR_USE_TRANSIENT(ary, ptr, ptr[0] = Qnil);
+    if (len == 0) {
+        rb_ary_modify_check(ary);
+        return Qnil;
     }
-    ARY_INCREASE_PTR(ary, 1);		/* shift ptr */
-    ARY_INCREASE_LEN(ary, -1);
 
-    ary_verify(ary);
+    top = RARRAY_AREF(ary, 0);
+
+    rb_ary_behead(ary, 1);
 
     return top;
 }
@@ -1498,48 +1482,37 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary) https://github.com/ruby/ruby/blob/trunk/array.c#L1482
     return result;
 }
 
-static VALUE
-behead_shared(VALUE ary, long n)
-{
-    assert(ARY_SHARED_P(ary));
-    rb_ary_modify_check(ary);
-    if (ARY_SHARED_ROOT_OCCUPIED(ARY_SHARED_ROOT(ary))) {
-        ary_mem_clear(ary, 0, n);
-    }
-    ARY_INCREASE_PTR(ary, n);
-    ARY_INCREASE_LEN(ary, -n);
-    ary_verify(ary);
-    return ary;
-}
-
-static VALUE
-behead_transient(VALUE ary, long n)
-{
-    rb_ary_modify_check(ary);
-    RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
-        MEMMOVE(ptr, ptr+n, VALUE, RARRAY_LEN(ary)-n);
-    }); /* WB: no new reference */
-    ARY_INCREASE_LEN(ary, -n);
-    ary_verify(ary);
-    return ary;
-}
-
 MJIT_FUNC_EXPORTED VALUE
 rb_ary_behead(VALUE ary, long n)
 {
     if (n <= 0) {
         return ary;
     }
-    else if (ARY_SHARED_P(ary)) {
-        return behead_shared(ary, n);
-    }
-    else if (RARRAY_LEN(ary) >= ARY_DEFAULT_SIZE) {
+
+    rb_ary_modify_check(ary);
+
+    if (RB_UNLIKELY(!ARY_SHARED_P(ary))) {
+        if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
+            RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
+                MEMMOVE(ptr, ptr + n, VALUE, RARRAY_LEN(ary) - n);
+            }); /* WB: no new reference */
+            ARY_INCREASE_LEN(ary, -n);
+            ary_verify(ary);
+            return ary;
+        }
+
+        ary_mem_clear(ary, 0, n);
         ary_make_shared(ary);
-        return behead_shared(ary, n);
     }
-    else {
-        return behead_transient(ary, n);
+    else if (ARY_SHARED_ROOT_OCCUPIED(ARY_SHARED_ROOT(ary))) {
+        ary_mem_clear(ary, 0, n);
     }
+
+    ARY_INCREASE_PTR(ary, n);
+    ARY_INCREASE_LEN(ary, -n);
+    ary_verify(ary);
+
+    return ary;
 }
 
 static VALUE
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]