diff options
author | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-27 09:54:27 +0000 |
---|---|---|
committer | usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-27 09:54:27 +0000 |
commit | 5cf605b1d2769239de77fe9836cbd320b4482257 (patch) | |
tree | 3fc0d5a68fb9bebef15286aca8ebad09cfacdd1d /bignum.c | |
parent | 7a5d45fc3c0fd7644a6025367f299ee344e62ee7 (diff) | |
download | ruby-5cf605b1d2769239de77fe9836cbd320b4482257.tar.gz |
* 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
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29612 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r-- | bignum.c | 6 |
1 files changed, 3 insertions, 3 deletions
@@ -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; |