aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--enum.c9
2 files changed, 14 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index c7cdc8d6ef..7fe479ef34 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun May 10 11:23:03 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * enum.c (enum_to_a): Use size to set array capa when possible.
+ the patch is from HonoreDB <aweiner at mdsol.com>.
+ [fix GH-444]
+
Sat May 9 06:48:36 2015 Eric Wong <e@80x24.org>
* ext/socket/ancdata.c (bsock_recvmsg_internal): GC guard
diff --git a/enum.c b/enum.c
index a49e4b0b74..ea151b464d 100644
--- a/enum.c
+++ b/enum.c
@@ -515,7 +515,14 @@ enum_flat_map(VALUE obj)
static VALUE
enum_to_a(int argc, VALUE *argv, VALUE obj)
{
- VALUE ary = rb_ary_new();
+ VALUE ary, size = rb_check_funcall(obj, id_size, 0, 0);
+
+ if (NIL_P(size) || size == Qundef) {
+ ary = rb_ary_new();
+ }
+ else {
+ ary = rb_ary_new_capa(NUM2LONG(size));
+ }
rb_block_call(obj, id_each, argc, argv, collect_all, ary);
OBJ_INFECT(ary, obj);