diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | bignum.c | 6 |
2 files changed, 11 insertions, 3 deletions
@@ -1,3 +1,11 @@ +Wed Oct 27 18:50:17 2010 NAKAMURA Usaku <usa@ruby-lang.org> + + * bignum.c (rb_big2long, rb_big2ulong): rb2ulong() returns VALUE, but + its real range is ulong. So, if the size of VALUE is bigger than + ulong, upper bits are always zero even if the actual value is + negative. + fixed #3490 + Wed Oct 27 18:27:17 2010 NAKAMURA Usaku <usa@ruby-lang.org> * test/ruby/test_io.rb (TestIO#pipe): should close write end of pipe @@ -1176,7 +1176,7 @@ rb_big2ulong(VALUE x) VALUE num = big2ulong(x, "unsigned long", TRUE); if (!RBIGNUM_SIGN(x)) { - if ((SIGNED_VALUE)num < 0) { + if ((long)num < 0) { rb_raise(rb_eRangeError, "bignum out of range of unsigned long"); } return (VALUE)(-(SIGNED_VALUE)num); @@ -1189,8 +1189,8 @@ rb_big2long(VALUE x) { VALUE num = big2ulong(x, "long", TRUE); - if ((SIGNED_VALUE)num < 0 && - (RBIGNUM_SIGN(x) || (SIGNED_VALUE)num != LONG_MIN)) { + if ((long)num < 0 && + (RBIGNUM_SIGN(x) || (long)num != LONG_MIN)) { rb_raise(rb_eRangeError, "bignum too big to convert into `long'"); } if (!RBIGNUM_SIGN(x)) return -(SIGNED_VALUE)num; |