From a82ea310a94f036249718a6d384daa3031ee4d0d Mon Sep 17 00:00:00 2001 From: naruse Date: Sun, 15 May 2016 07:17:46 +0000 Subject: * 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 --- ChangeLog | 5 +++++ array.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1d951600b9..61ca0f78cf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sun May 15 16:15:25 2016 NARUSE, Yui + + * 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 * vm_insnhelper.c (vm_get_ev_const): warn deprecated constant even diff --git a/array.c b/array.c index 8b68320fa0..11fba55029 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 -- cgit v1.2.3