diff options
Diffstat (limited to 'bignum.c')
-rw-r--r-- | bignum.c | 8 |
1 files changed, 8 insertions, 0 deletions
@@ -1468,12 +1468,17 @@ rb_big_rshift(x, y) long j; if (shift < 0) return rb_big_lshift(x, INT2FIX(-shift)); + if (s1 > RBIGNUM(x)->len) { if (RBIGNUM(x)->sign) return INT2FIX(0); else return INT2FIX(-1); } + if (!RBIGNUM(x)->sign) { + x = rb_big_clone(x); + rb_big_2comp(x); + } xds = BDIGITS(x); i = RBIGNUM(x)->len; j = i - s1; z = bignew(j, RBIGNUM(x)->sign); @@ -1483,6 +1488,9 @@ rb_big_rshift(x, y) zds[j] = BIGLO(num); num = BIGUP(xds[i]); } + if (!RBIGNUM(x)->sign) { + rb_big_2comp(z); + } return bignorm(z); } |