Skip to content

Commit

Permalink
* numeric.c (bit_coerce): A Fixnum and a Bignum are only permitted for
Browse files Browse the repository at this point in the history
 bitwise arithmetic with a Fixnum.  ruby#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.  ruby#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
  • Loading branch information
mrkn committed Aug 29, 2011
1 parent 0d530b2 commit 640420f
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 7 deletions.
12 changes: 12 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,15 @@
Sun Aug 29 09:58:00 2011 Kenta Murata <[email protected]>

* 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 <[email protected]>

* ext/date/date_parse.c (date_zone_to_diff): keep a temporary string
Expand Down
6 changes: 3 additions & 3 deletions bignum.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
7 changes: 3 additions & 4 deletions numeric.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
44 changes: 44 additions & 0 deletions test/ruby/test_bignum.rb
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,8 @@ def test_to_s
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)
Expand Down Expand Up @@ -321,6 +323,48 @@ def test_xor
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)
Expand Down
42 changes: 42 additions & 0 deletions test/ruby/test_fixnum.rb
Original file line number Diff line number Diff line change
Expand Up @@ -229,4 +229,46 @@ def test_cmp
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

0 comments on commit 640420f

Please sign in to comment.