[ruby-dev:48961] [Ruby trunk - Bug #11130] Re: [ruby-changes:38376] glass:r50457 (trunk): * enum.c (enum_to_a): Use size to set array capa when possible.
From:
usa@...
Date:
2015-05-10 13:56:33 UTC
List:
ruby-dev #48961
Issue #11130 has been updated by Usaku NAKAMURA.
Description updated
----------------------------------------
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-52365
* 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/