* enum.c (enum_inject): Implement the specialized code for self is an
array and a symbol operator is given. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@54119 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
e89232eb15
commit
95d2ec93bc
@ -1,3 +1,8 @@
|
||||
Tue Mar 15 20:21:01 2016 Tanaka Akira <akr@fsij.org>
|
||||
|
||||
* enum.c (enum_inject): Implement the specialized code for self is an
|
||||
array and a symbol operator is given.
|
||||
|
||||
Tue Mar 15 16:29:51 2016 Martin Duerst <duerst@it.aoyama.ac.jp>
|
||||
|
||||
* enc/unicode.c: Eliminating common code.
|
||||
|
24
enum.c
24
enum.c
@ -701,6 +701,30 @@ enum_inject(int argc, VALUE *argv, VALUE obj)
|
||||
iter = inject_op_i;
|
||||
break;
|
||||
}
|
||||
|
||||
if (iter == inject_op_i &&
|
||||
SYMBOL_P(op) &&
|
||||
RB_TYPE_P(obj, T_ARRAY) &&
|
||||
rb_method_basic_definition_p(CLASS_OF(obj), id_each)) {
|
||||
VALUE v;
|
||||
long i;
|
||||
if (RARRAY_LEN(obj) == 0)
|
||||
return init == Qundef ? Qnil : init;
|
||||
if (init == Qundef) {
|
||||
v = RARRAY_AREF(obj, 0);
|
||||
i = 1;
|
||||
}
|
||||
else {
|
||||
v = init;
|
||||
i = 0;
|
||||
}
|
||||
id = SYM2ID(op);
|
||||
for (; i<RARRAY_LEN(obj); i++) {
|
||||
v = rb_funcall(v, id, 1, RARRAY_AREF(obj, i));
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
memo = MEMO_NEW(init, Qnil, op);
|
||||
rb_block_call(obj, id_each, 0, 0, iter, (VALUE)memo);
|
||||
if (memo->v1 == Qundef) return Qnil;
|
||||
|
Loading…
x
Reference in New Issue
Block a user