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
34
array.c
34
array.c
@ -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);
|
||||||
|
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;
|
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 */
|
/* 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));
|
||||||
|
@ -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, ...) \
|
||||||
|
@ -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)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user