diff options
Diffstat (limited to 'array.c')
-rw-r--r-- | array.c | 11 |
1 files changed, 9 insertions, 2 deletions
@@ -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 |