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

ruby-changes:61973

From: =E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3 <ko1@a...>
Date: Mon, 29 Jun 2020 11:06:22 +0900 (JST)
Subject: [ruby-changes:61973] 4dc83eefce (master): rb_ary_aset: do not goto into a branch

https://git.ruby-lang.org/ruby.git/commit/?id=4dc83eefce

From 4dc83eefcea94dec999a7a66ffab4f1d96b9ed2c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=8D=9C=E9=83=A8=E6=98=8C=E5=B9=B3?=
 <shyouhei@r...>
Date: Thu, 11 Jun 2020 10:48:59 +0900
Subject: rb_ary_aset: do not goto into a branch

I'm not necessarily against every goto in general, but jumping into a
branch is definitely a bad idea.  Better refactor.

diff --git a/array.c b/array.c
index 3bbc094..e062bf7 100644
--- a/array.c
+++ b/array.c
@@ -2412,6 +2412,22 @@ rb_ary_resize(VALUE ary, long len) https://github.com/ruby/ruby/blob/trunk/array.c#L2412
     return ary;
 }
 
+static VALUE
+ary_aset_by_rb_ary_store(VALUE ary, long key, VALUE val)
+{
+    rb_ary_store(ary, key, val);
+    return val;
+}
+
+static VALUE
+ary_aset_by_rb_ary_splice(VALUE ary, long beg, long len, VALUE val)
+{
+    VALUE rpl = rb_ary_to_ary(val);
+    rb_ary_splice(ary, beg, len, RARRAY_CONST_PTR_TRANSIENT(rpl), RARRAY_LEN(rpl));
+    RB_GC_GUARD(rpl);
+    return val;
+}
+
 /*
  *  call-seq:
  *    array[index] = object -> object
@@ -2558,33 +2574,25 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/array.c#L2574
 rb_ary_aset(int argc, VALUE *argv, VALUE ary)
 {
     long offset, beg, len;
-    VALUE rpl;
 
+    rb_check_arity(argc, 2, 3);
+    rb_ary_modify_check(ary);
     if (argc == 3) {
-	rb_ary_modify_check(ary);
 	beg = NUM2LONG(argv[0]);
 	len = NUM2LONG(argv[1]);
-	goto range;
+        return ary_aset_by_rb_ary_splice(ary, beg, len, argv[2]);
     }
-    rb_check_arity(argc, 2, 2);
-    rb_ary_modify_check(ary);
     if (FIXNUM_P(argv[0])) {
 	offset = FIX2LONG(argv[0]);
-	goto fixnum;
+        return ary_aset_by_rb_ary_store(ary, offset, argv[1]);
     }
     if (rb_range_beg_len(argv[0], &beg, &len, RARRAY_LEN(ary), 1)) {
 	/* check if idx is Range */
-      range:
-	rpl = rb_ary_to_ary(argv[argc-1]);
-        rb_ary_splice(ary, beg, len, RARRAY_CONST_PTR_TRANSIENT(rpl), RARRAY_LEN(rpl));
-	RB_GC_GUARD(rpl);
-	return argv[argc-1];
+        return ary_aset_by_rb_ary_splice(ary, beg, len, argv[1]);
     }
 
     offset = NUM2LONG(argv[0]);
-fixnum:
-    rb_ary_store(ary, offset, argv[1]);
-    return argv[1];
+    return ary_aset_by_rb_ary_store(ary, offset, argv[1]);
 }
 
 /*
-- 
cgit v0.10.2


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

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