From: Tanaka Akira Date: 2010-05-19T23:28:35+09:00 Subject: [ruby-dev:41361] Re: [ruby-cvs:35102] Ruby:r27890 (trunk): * numeric.c (rb_num2ulong): use rb_big2ulong for data from 2010/5/19 : > naruse 2010-05-19 18:22:59 +0900 (Wed, 19 May 2010) > > New Revision: 27890 > > http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=27890 > > Log: > * numeric.c (rb_num2ulong): use rb_big2ulong for data from > Bignum. Without this 32bit integer on 32bit environment > can't converted into long. > This fixes 1) and 2) of [ruby-dev:41289] 気になったんですが、rb_num2ulong に Float を与えたときに RFLOAT_VALUE(val) <= (double)LONG_MAX が成り立たないとエラーというのは変な気がします。 LONG_MAX は signed long の最大値で、unsigned long の最大値では ないんじゃないでしょうか。 実行して試すのはちょっと自明じゃないんですが、 Zlib.adler32_combine が NUM2ULONG を呼ぶようなので、 以下のようにすると (2**31).to_f という unsigned long の範囲内の値が エラーになることが観測できます。 % ./ruby -rzlib -ve 'Zlib.adler32_combine((2**31).to_f,0,0)' ruby 1.9.3dev (2010-05-19 trunk 27897) [i686-linux] -e:1:in `adler32_combine': float 2147483648 out of range of integer (RangeError) from -e:1:in `
' 整数ならエラーにはなりません。 % ./ruby -rzlib -e 'Zlib.adler32_combine(2**31,0,0)' -- [田中 哲][たなか あきら][Tanaka Akira]