summaryrefslogtreecommitdiff
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
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
-rw-r--r--ChangeLog7
-rw-r--r--bignum.c16
2 files changed, 14 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 5f90d7c7f4..41c27ea7e2 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Jul 16 19:05:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big_shift3): Big shift width is not a problem for right
+ shift.
+
Tue Jul 16 18:50:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* array.c (rb_ary_count): [DOC] fix typo. Array#count uses ==, not
@@ -7,7 +12,7 @@ Tue Jul 16 18:35:48 2013 Tanaka Akira <akr@fsij.org>
* bignum.c (bary_mul_karatsuba): Avoid duplicate calculation when
squaring.
- ((bary_mul_toom3_branch): Ditto.
+ (bary_mul_toom3_branch): Ditto.
Tue Jul 16 17:43:22 2013 Koichi Sasada <ko1@atdot.net>
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) {