aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--enum.c26
2 files changed, 20 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 03d82c5f61..caf9b07c6c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sat Dec 30 04:25:29 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * enum.c (enum_inject): reuse array for yield parameters.
+
Sat Dec 30 02:54:22 2006 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/stringio/stringio.c (strio_gets): accepts limit argument.
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