diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-16 10:08:25 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2013-07-16 10:08:25 +0000 |
commit | 4106413465aa37e4cb81b71f56f06613d06d88d1 (patch) | |
tree | 1c6b56060c06e727b8beabd12ba6406c4ac4eb43 | |
parent | 3569c6c3a611a5e0ed8b84e1dad27f0a31568d80 (diff) | |
download | ruby-4106413465aa37e4cb81b71f56f06613d06d88d1.tar.gz |
* 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-- | ChangeLog | 7 | ||||
-rw-r--r-- | bignum.c | 16 |
2 files changed, 14 insertions, 9 deletions
@@ -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> @@ -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) { |