summaryrefslogtreecommitdiff
path: root/bignum.c
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-16 10:08:25 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-07-16 10:08:25 +0000
commit4106413465aa37e4cb81b71f56f06613d06d88d1 (patch)
tree1c6b56060c06e727b8beabd12ba6406c4ac4eb43 /bignum.c
parent3569c6c3a611a5e0ed8b84e1dad27f0a31568d80 (diff)
* bignum.c (big_shift3): Big shift width is not a problem for right
shift. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@42004 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'bignum.c')
-rw-r--r--bignum.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/bignum.c b/bignum.c
index 3a03f1bbfc..15ec5810ed 100644
--- a/bignum.c
+++ b/bignum.c
@@ -3263,14 +3263,12 @@ big_shift3(VALUE x, int lshift_p, size_t shift_numdigits, int shift_numbits)
VALUE z;
long xn;
- if (LONG_MAX < shift_numdigits) {
- rb_raise(rb_eArgError, "too big number");
- }
-
- s1 = shift_numdigits;
- s2 = shift_numbits;
-
if (lshift_p) {
+ if (LONG_MAX < shift_numdigits) {
+ rb_raise(rb_eArgError, "too big number");
+ }
+ s1 = shift_numdigits;
+ s2 = shift_numbits;
xn = RBIGNUM_LEN(x);
z = bignew(xn+s1+1, RBIGNUM_SIGN(x));
zds = BDIGITS(z);
@@ -3281,13 +3279,15 @@ big_shift3(VALUE x, int lshift_p, size_t shift_numdigits, int shift_numbits)
else {
long zn;
BDIGIT hibitsx;
- if (s1 >= RBIGNUM_LEN(x)) {
+ if (LONG_MAX < shift_numdigits || (size_t)RBIGNUM_LEN(x) <= shift_numdigits) {
if (RBIGNUM_POSITIVE_P(x) ||
bary_zero_p(BDIGITS(x), RBIGNUM_LEN(x)))
return INT2FIX(0);
else
return INT2FIX(-1);
}
+ s1 = shift_numdigits;
+ s2 = shift_numbits;
hibitsx = abs2twocomp(&x, &xn);
xds = BDIGITS(x);
if (xn <= s1) {