mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* numeric.c (bit_coerce): A Fixnum and a Bignum are only permitted for
bitwise arithmetic with a Fixnum. #1792 * test/ruby/test_fixnum.rb: add tests for the above change. * bignum.c (bit_coerce): A Fixnum and a Bignum are only permitted for bitwise arithmetic with a Bignum. #1792 * test/ruby/test_bignum.rb: add tests for the above change. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33108 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
0d530b2392
commit
640420f704
5 changed files with 104 additions and 7 deletions
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
|||
Sun Aug 29 09:58:00 2011 Kenta Murata <mrkn@mrkn.jp>
|
||||
|
||||
* numeric.c (bit_coerce): A Fixnum and a Bignum are only permitted for
|
||||
bitwise arithmetic with a Fixnum. #1792
|
||||
|
||||
* test/ruby/test_fixnum.rb: add tests for the above change.
|
||||
|
||||
* bignum.c (bit_coerce): A Fixnum and a Bignum are only permitted for
|
||||
bitwise arithmetic with a Bignum. #1792
|
||||
|
||||
* test/ruby/test_bignum.rb: add tests for the above change.
|
||||
|
||||
Sun Aug 28 15:38:17 2011 CHIKANAGA Tomoyuki <nagachika00@gmail.com>
|
||||
|
||||
* ext/date/date_parse.c (date_zone_to_diff): keep a temporary string
|
||||
|
|
6
bignum.c
6
bignum.c
|
@ -3108,9 +3108,9 @@ static inline VALUE
|
|||
bit_coerce(VALUE x)
|
||||
{
|
||||
while (!FIXNUM_P(x) && TYPE(x) != T_BIGNUM) {
|
||||
if (TYPE(x) == T_FLOAT) {
|
||||
rb_raise(rb_eTypeError, "can't convert Float into Integer");
|
||||
}
|
||||
rb_raise(rb_eTypeError,
|
||||
"can't convert %s into Integer for bitwise arithmetic",
|
||||
rb_obj_classname(x));
|
||||
x = rb_to_int(x);
|
||||
}
|
||||
return x;
|
||||
|
|
|
@ -2917,10 +2917,9 @@ static VALUE
|
|||
bit_coerce(VALUE x)
|
||||
{
|
||||
while (!FIXNUM_P(x) && TYPE(x) != T_BIGNUM) {
|
||||
if (TYPE(x) == T_FLOAT) {
|
||||
rb_raise(rb_eTypeError, "can't convert Float into Integer");
|
||||
}
|
||||
x = rb_to_int(x);
|
||||
rb_raise(rb_eTypeError,
|
||||
"can't convert %s into Integer for bitwise arithmetic",
|
||||
rb_obj_classname(x));
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
|
|
@ -118,6 +118,8 @@ class TestBignum < Test::Unit::TestCase
|
|||
T32P = T32 - 1 # 4294967295
|
||||
T64 = 2**64 # 18446744073709551616
|
||||
T64P = T64 - 1 # 18446744073709551615
|
||||
T1024 = 2**1024
|
||||
T1024P = T1024 - 1
|
||||
|
||||
def test_big_2comp
|
||||
assert_equal("-4294967296", (~T32P).to_s)
|
||||
|
@ -321,6 +323,48 @@ class TestBignum < Test::Unit::TestCase
|
|||
assert_equal(T64 + T32, T32 ^ T64)
|
||||
end
|
||||
|
||||
class DummyNumeric < Numeric
|
||||
def to_int
|
||||
1
|
||||
end
|
||||
end
|
||||
|
||||
def test_and_with_float
|
||||
assert_raise(TypeError) { T1024 & 1.5 }
|
||||
end
|
||||
|
||||
def test_and_with_rational
|
||||
assert_raise(TypeError, "#1792") { T1024 & Rational(3, 2) }
|
||||
end
|
||||
|
||||
def test_and_with_nonintegral_numeric
|
||||
assert_raise(TypeError, "#1792") { T1024 & DummyNumeric.new }
|
||||
end
|
||||
|
||||
def test_or_with_float
|
||||
assert_raise(TypeError) { T1024 | 1.5 }
|
||||
end
|
||||
|
||||
def test_or_with_rational
|
||||
assert_raise(TypeError, "#1792") { T1024 | Rational(3, 2) }
|
||||
end
|
||||
|
||||
def test_or_with_nonintegral_numeric
|
||||
assert_raise(TypeError, "#1792") { T1024 | DummyNumeric.new }
|
||||
end
|
||||
|
||||
def test_xor_with_float
|
||||
assert_raise(TypeError) { T1024 ^ 1.5 }
|
||||
end
|
||||
|
||||
def test_xor_with_rational
|
||||
assert_raise(TypeError, "#1792") { T1024 ^ Rational(3, 2) }
|
||||
end
|
||||
|
||||
def test_xor_with_nonintegral_numeric
|
||||
assert_raise(TypeError, "#1792") { T1024 ^ DummyNumeric.new }
|
||||
end
|
||||
|
||||
def test_shift2
|
||||
assert_equal(2**33, (2**32) << 1)
|
||||
assert_equal(2**31, (2**32) << -1)
|
||||
|
|
|
@ -229,4 +229,46 @@ class TestFixnum < Test::Unit::TestCase
|
|||
assert(!(1.send(:<=, 0.0)))
|
||||
assert_raise(ArgumentError) { 1.send(:<=, nil) }
|
||||
end
|
||||
|
||||
class DummyNumeric < Numeric
|
||||
def to_int
|
||||
1
|
||||
end
|
||||
end
|
||||
|
||||
def test_and_with_float
|
||||
assert_raise(TypeError) { 1 & 1.5 }
|
||||
end
|
||||
|
||||
def test_and_with_rational
|
||||
assert_raise(TypeError, "#1792") { 1 & Rational(3, 2) }
|
||||
end
|
||||
|
||||
def test_and_with_nonintegral_numeric
|
||||
assert_raise(TypeError, "#1792") { 1 & DummyNumeric.new }
|
||||
end
|
||||
|
||||
def test_or_with_float
|
||||
assert_raise(TypeError) { 1 | 1.5 }
|
||||
end
|
||||
|
||||
def test_or_with_rational
|
||||
assert_raise(TypeError, "#1792") { 1 | Rational(3, 2) }
|
||||
end
|
||||
|
||||
def test_or_with_nonintegral_numeric
|
||||
assert_raise(TypeError, "#1792") { 1 | DummyNumeric.new }
|
||||
end
|
||||
|
||||
def test_xor_with_float
|
||||
assert_raise(TypeError) { 1 ^ 1.5 }
|
||||
end
|
||||
|
||||
def test_xor_with_rational
|
||||
assert_raise(TypeError, "#1792") { 1 ^ Rational(3, 2) }
|
||||
end
|
||||
|
||||
def test_xor_with_nonintegral_numeric
|
||||
assert_raise(TypeError, "#1792") { 1 ^ DummyNumeric.new }
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue