vm_insnhelper.c: array aref optimization

* vm_insnhelper.c (vm_opt_aref): optimize on other than fixnum
  argument too.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60333 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-10-22 00:19:12 +00:00
parent f36ee4406e
commit e480660b85
3 changed files with 25 additions and 16 deletions

26
array.c
View File

@ -1284,21 +1284,29 @@ rb_ary_subseq(VALUE ary, long beg, long len)
VALUE VALUE
rb_ary_aref(int argc, const VALUE *argv, VALUE ary) rb_ary_aref(int argc, const VALUE *argv, VALUE ary)
{ {
VALUE arg; rb_check_arity(argc, 1, 2);
long beg, len;
if (argc == 2) { if (argc == 2) {
beg = NUM2LONG(argv[0]); return rb_ary_aref2(ary, argv[0], argv[1]);
len = NUM2LONG(argv[1]); }
return rb_ary_aref1(ary, argv[0]);
}
VALUE
rb_ary_aref2(VALUE ary, VALUE b, VALUE e)
{
long beg = NUM2LONG(b);
long len = NUM2LONG(e);
if (beg < 0) { if (beg < 0) {
beg += RARRAY_LEN(ary); beg += RARRAY_LEN(ary);
} }
return rb_ary_subseq(ary, beg, len); return rb_ary_subseq(ary, beg, len);
} }
if (argc != 1) {
rb_scan_args(argc, argv, "11", NULL, NULL); VALUE
} rb_ary_aref1(VALUE ary, VALUE arg)
arg = argv[0]; {
long beg, len;
/* special case - speeding up */ /* special case - speeding up */
if (FIXNUM_P(arg)) { if (FIXNUM_P(arg)) {
return rb_ary_entry(ary, FIX2LONG(arg)); return rb_ary_entry(ary, FIX2LONG(arg));

View File

@ -1032,6 +1032,8 @@ void rb_ary_set_len(VALUE, long);
void rb_ary_delete_same(VALUE, VALUE); void rb_ary_delete_same(VALUE, VALUE);
VALUE rb_ary_tmp_new_fill(long capa); VALUE rb_ary_tmp_new_fill(long capa);
VALUE rb_ary_at(VALUE, VALUE); VALUE rb_ary_at(VALUE, VALUE);
VALUE rb_ary_aref1(VALUE ary, VALUE i);
VALUE rb_ary_aref2(VALUE ary, VALUE b, VALUE e);
size_t rb_ary_memsize(VALUE); size_t rb_ary_memsize(VALUE);
#ifdef __GNUC__ #ifdef __GNUC__
#define rb_ary_new_from_args(n, ...) \ #define rb_ary_new_from_args(n, ...) \

View File

@ -3584,9 +3584,8 @@ vm_opt_aref(VALUE recv, VALUE obj)
return Qundef; return Qundef;
} }
else if (RBASIC_CLASS(recv) == rb_cArray && else if (RBASIC_CLASS(recv) == rb_cArray &&
BASIC_OP_UNREDEFINED_P(BOP_AREF, ARRAY_REDEFINED_OP_FLAG) && BASIC_OP_UNREDEFINED_P(BOP_AREF, ARRAY_REDEFINED_OP_FLAG)) {
FIXNUM_P(obj)) { return rb_ary_aref1(recv, obj);
return rb_ary_entry(recv, FIX2LONG(obj));
} }
else if (RBASIC_CLASS(recv) == rb_cHash && else if (RBASIC_CLASS(recv) == rb_cHash &&
BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG)) { BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG)) {