* bignum.c (rb_big2ull): fix off-by-twice bug of NUM2ULL.
* test/-ext-/num2int/test_num2int.rb (class TestNum2int): fix a testcase too. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33742 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
11137bed53
commit
d3437b7c1a
@ -1,3 +1,9 @@
|
|||||||
|
Sun Nov 13 10:23:48 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
|
* bignum.c (rb_big2ull): fix off-by-twice bug of NUM2ULL.
|
||||||
|
* test/-ext-/num2int/test_num2int.rb (class TestNum2int):
|
||||||
|
fix a testcase too.
|
||||||
|
|
||||||
Sun Nov 13 10:22:44 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
Sun Nov 13 10:22:44 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
* test/-ext-/num2int/test_num2int.rb (class TestNum2int):
|
* test/-ext-/num2int/test_num2int.rb (class TestNum2int):
|
||||||
|
10
bignum.c
10
bignum.c
@ -1257,8 +1257,14 @@ rb_big2ull(VALUE x)
|
|||||||
{
|
{
|
||||||
unsigned LONG_LONG num = big2ull(x, "unsigned long long");
|
unsigned LONG_LONG num = big2ull(x, "unsigned long long");
|
||||||
|
|
||||||
if (!RBIGNUM_SIGN(x))
|
if (!RBIGNUM_SIGN(x)) {
|
||||||
return (VALUE)(-(SIGNED_VALUE)num);
|
VALUE v = (VALUE)(-(SIGNED_VALUE)num);
|
||||||
|
|
||||||
|
/* FIXNUM_MIN-1 .. LLONG_MIN mapped into 0xbfffffffffffffff .. LONG_MAX+1 */
|
||||||
|
if (v <= LLONG_MAX)
|
||||||
|
rb_raise(rb_eRangeError, "bignum out of range of unsigned long long");
|
||||||
|
return v;
|
||||||
|
}
|
||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,20 +162,11 @@ class TestNum2int < Test::Unit::TestCase
|
|||||||
assert_output(ULLONG_MAX.to_s) do
|
assert_output(ULLONG_MAX.to_s) do
|
||||||
Num2int.print_num2ull(-1)
|
Num2int.print_num2ull(-1)
|
||||||
end
|
end
|
||||||
assert_output((LLONG_MAX+2).to_s) do
|
assert_output((LLONG_MAX+1).to_s) do
|
||||||
Num2int.print_num2ull(LLONG_MIN+1)
|
Num2int.print_num2ull(LLONG_MIN)
|
||||||
end
|
|
||||||
|
|
||||||
# maybe bug
|
|
||||||
assert_output((LLONG_MAX).to_s) do
|
|
||||||
Num2int.print_num2ull(LLONG_MIN-1)
|
|
||||||
end
|
|
||||||
# maybe bug
|
|
||||||
assert_output(1.to_s) do
|
|
||||||
Num2int.print_num2ull(LLONG_MIN*2+1)
|
|
||||||
end
|
end
|
||||||
assert_raise(RangeError) do
|
assert_raise(RangeError) do
|
||||||
Num2int.print_num2ull(LLONG_MIN*2)
|
Num2int.print_num2ull(LLONG_MIN-1)
|
||||||
end
|
end
|
||||||
assert_raise(RangeError) do
|
assert_raise(RangeError) do
|
||||||
Num2int.print_num2ull(ULLONG_MAX+1)
|
Num2int.print_num2ull(ULLONG_MAX+1)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user