Issue #11130 has been updated by Usaku NAKAMURA.

Status changed from Open to Assigned
Assignee set to Masaki Matsushita
ruby -v set to r50457
Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN to 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: DONTNEED

----------------------------------------
Bug #11130: Re: [ruby-changes:38376] glass:r50457 (trunk): * enum.c (enum_to_a): Use size to set array capa when possible.
https://bugs.ruby-lang.org/issues/11130#change-52364

* Author: Kouhei Sutou
* Status: Assigned
* Priority: Normal
* Assignee: Masaki Matsushita
* ruby -v: r50457
* Backport: 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: DONTNEED
----------------------------------------
 須藤です。
 
 > +    if (NIL_P(size) || size == Qundef) {
 > +	ary = rb_ary_new();
 > +    }
 > +    else {
 > +	ary = rb_ary_new_capa(NUM2LONG(size));
 > +    }
 
 を
 
     if (FIXNUM_P(size)) {
 	ary = rb_ary_new_capa(NUM2LONG(size));
     }
     else {
 	ary = rb_ary_new();
     }
 
 とかsizeが返す値が数値じゃなかったらこれまでと同じ挙動にする
 ようにしてもらえないでしょうか?
 
 これまでは
 
 class NonIntegerSizeEnum
   include Enumerable
 
   def initialize(n)
     @n = n
   end
 
   def each
     @n.times { |i| yield i }
   end
 
   def size
     :size
   end
 end
 
 NonIntegerSizeEnum.new(100).to_a
 
 というコードが動いていたんですが、この変更の後からは
 
 /tmp/b.rb:17:in `to_a': no implicit conversion of Symbol into Integer (TypeError)
 
 というエラーがでるようになってしまって困っています。
 
 In <20150510022540.1547A118611 / sakura2.atdot.net>
   "[ruby-changes:38376] glass:r50457 (trunk): * enum.c (enum_to_a): Use size to set array capa when possible." on Sun, 10 May 2015 11:25:40 +0900 (JST),
   glass <ko1 / atdot.net> wrote:
 
 > glass	2015-05-10 11:25:33 +0900 (Sun, 10 May 2015)
 > 
 >   New Revision: 50457
 > 
 >   http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=50457
 > 
 >   Log:
 >     * 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]
 > 
 >   Modified files:
 >     trunk/ChangeLog
 >     trunk/enum.c
 > Index: ChangeLog
 > ===================================================================
 > --- ChangeLog	(revision 50456)
 > +++ ChangeLog	(revision 50457)
 > @@ -1,3 +1,9 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
 > +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
 > Index: enum.c
 > ===================================================================
 > --- enum.c	(revision 50456)
 > +++ enum.c	(revision 50457)
 > @@ -515,7 +515,14 @@ enum_flat_map(VALUE obj) https://github.com/ruby/ruby/blob/trunk/enum.c#L515
 >  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);
 > 
 > --
 > ML: ruby-changes / quickml.atdot.net
 > Info: http://www.atdot.net/~ko1/quickml/



-- 
https://bugs.ruby-lang.org/