mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
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:
parent
f36ee4406e
commit
e480660b85
3 changed files with 25 additions and 16 deletions
34
array.c
34
array.c
|
@ -1284,21 +1284,29 @@ rb_ary_subseq(VALUE ary, long beg, long len)
|
|||
VALUE
|
||||
rb_ary_aref(int argc, const VALUE *argv, VALUE ary)
|
||||
{
|
||||
VALUE arg;
|
||||
rb_check_arity(argc, 1, 2);
|
||||
if (argc == 2) {
|
||||
return rb_ary_aref2(ary, argv[0], 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) {
|
||||
beg += RARRAY_LEN(ary);
|
||||
}
|
||||
return rb_ary_subseq(ary, beg, len);
|
||||
}
|
||||
|
||||
VALUE
|
||||
rb_ary_aref1(VALUE ary, VALUE arg)
|
||||
{
|
||||
long beg, len;
|
||||
|
||||
if (argc == 2) {
|
||||
beg = NUM2LONG(argv[0]);
|
||||
len = NUM2LONG(argv[1]);
|
||||
if (beg < 0) {
|
||||
beg += RARRAY_LEN(ary);
|
||||
}
|
||||
return rb_ary_subseq(ary, beg, len);
|
||||
}
|
||||
if (argc != 1) {
|
||||
rb_scan_args(argc, argv, "11", NULL, NULL);
|
||||
}
|
||||
arg = argv[0];
|
||||
/* special case - speeding up */
|
||||
if (FIXNUM_P(arg)) {
|
||||
return rb_ary_entry(ary, FIX2LONG(arg));
|
||||
|
|
|
@ -1032,6 +1032,8 @@ void rb_ary_set_len(VALUE, long);
|
|||
void rb_ary_delete_same(VALUE, VALUE);
|
||||
VALUE rb_ary_tmp_new_fill(long capa);
|
||||
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);
|
||||
#ifdef __GNUC__
|
||||
#define rb_ary_new_from_args(n, ...) \
|
||||
|
|
|
@ -3584,9 +3584,8 @@ vm_opt_aref(VALUE recv, VALUE obj)
|
|||
return Qundef;
|
||||
}
|
||||
else if (RBASIC_CLASS(recv) == rb_cArray &&
|
||||
BASIC_OP_UNREDEFINED_P(BOP_AREF, ARRAY_REDEFINED_OP_FLAG) &&
|
||||
FIXNUM_P(obj)) {
|
||||
return rb_ary_entry(recv, FIX2LONG(obj));
|
||||
BASIC_OP_UNREDEFINED_P(BOP_AREF, ARRAY_REDEFINED_OP_FLAG)) {
|
||||
return rb_ary_aref1(recv, obj);
|
||||
}
|
||||
else if (RBASIC_CLASS(recv) == rb_cHash &&
|
||||
BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG)) {
|
||||
|
|
Loading…
Reference in a new issue