summaryrefslogtreecommitdiff
path: root/enum.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-12-29 19:27:27 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2006-12-29 19:27:27 +0000
commit873b2f9fe3672f9006f0b73c96a103d73bac7092 (patch)
treea0d24fa8959887d77a5ced850756b5d5bb2f97f5 /enum.c
parent465fa424f00c8d8b6db61a3612a7d53bf39e233a (diff)
* enum.c (enum_inject): reuse array for yield parameters.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11430 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'enum.c')
-rw-r--r--enum.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/enum.c b/enum.c
index 4836aef72b..e5be2e4753 100644
--- a/enum.c
+++ b/enum.c
@@ -335,13 +335,14 @@ enum_to_a(VALUE obj)
}
static VALUE
-inject_i(VALUE i, VALUE *memo)
+inject_i(VALUE i, VALUE memo)
{
- if (*memo == Qundef) {
- *memo = i;
+ if (RARRAY_PTR(memo)[0] == Qundef) {
+ RARRAY_PTR(memo)[0] = i;
}
else {
- *memo = rb_yield_values(2, *memo, i);
+ RARRAY_PTR(memo)[1] = i;
+ RARRAY_PTR(memo)[0] = rb_yield(memo);
}
return Qnil;
}
@@ -380,13 +381,18 @@ inject_i(VALUE i, VALUE *memo)
static VALUE
enum_inject(int argc, VALUE *argv, VALUE obj)
{
- VALUE memo = Qundef;
+ VALUE memo, tmp;
- if (rb_scan_args(argc, argv, "01", &memo) == 0)
- memo = Qundef;
- rb_block_call(obj, id_each, 0, 0, inject_i, (VALUE)&memo);
- if (memo == Qundef) return Qnil;
- return memo;
+ if (rb_scan_args(argc, argv, "01", &tmp) == 0) {
+ memo = rb_ary_new3(2, Qundef, Qnil);
+ }
+ else {
+ memo = rb_ary_new3(2, tmp, Qnil);
+ }
+ rb_block_call(obj, id_each, 0, 0, inject_i, (VALUE)memo);
+ tmp = RARRAY_PTR(memo)[0];
+ if (tmp == Qundef) return Qnil;
+ return tmp;
}
static VALUE