aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-05-15 07:17:46 +0000
committernaruse <naruse@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-05-15 07:17:46 +0000
commita82ea310a94f036249718a6d384daa3031ee4d0d (patch)
tree376a40c2834c6e2a161d434439ac4687b9430090
parent0a3fb9af9518e91d68b9b77ca7e69a31827a491f (diff)
downloadruby-a82ea310a94f036249718a6d384daa3031ee4d0d.tar.gz
* array.c (rb_ary_entry): extract rb_ary_elt to organize if-conditions
and check whether is is embdeded at once. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@55007 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--array.c11
2 files changed, 14 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 1d95160..61ca0f7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sun May 15 16:15:25 2016 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * array.c (rb_ary_entry): extract rb_ary_elt to organize if-conditions
+ and check whether is is embdeded at once.
+
Sun May 15 10:57:26 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vm_insnhelper.c (vm_get_ev_const): warn deprecated constant even
diff --git a/array.c b/array.c
index 8b68320..11fba55 100644
--- a/array.c
+++ b/array.c
@@ -1195,10 +1195,17 @@ rb_ary_elt(VALUE ary, long offset)
VALUE
rb_ary_entry(VALUE ary, long offset)
{
+ long len = RARRAY_LEN(ary);
+ const VALUE *ptr = RARRAY_CONST_PTR(ary);
+ if (len == 0) return Qnil;
if (offset < 0) {
- offset += RARRAY_LEN(ary);
+ offset += len;
+ if (offset < 0) return Qnil;
+ }
+ else if (len <= offset) {
+ return Qnil;
}
- return rb_ary_elt(ary, offset);
+ return ptr[offset];
}
VALUE