From 4106413465aa37e4cb81b71f56f06613d06d88d1 Mon Sep 17 00:00:00 2001 From: akr Date: Tue, 16 Jul 2013 10:08:25 +0000 Subject: [PATCH] * 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 --- ChangeLog | 7 ++++++- bignum.c | 16 ++++++++-------- 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 + + * bignum.c (big_shift3): Big shift width is not a problem for right + shift. + Tue Jul 16 18:50:08 2013 Nobuyoshi Nakada * 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 * 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 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) {