From 2f4e8511cd602a6110b3636c316b5cac21181bf3 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Thu, 1 Oct 2015 18:01:37 +0100
Subject: [PATCH] py/mpz: Force rhs of mpz_shl_inpl/mpz_shr_inpl to be
 unsigned.

Python semantics are that rhs of shift must be non-negative, so there's
no need to handle negative values in the underlying mpz implementation.
---
 py/mpz.c | 8 ++------
 py/mpz.h | 4 ++--
 2 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/py/mpz.c b/py/mpz.c
index e7d9972e0..166fa7adb 100644
--- a/py/mpz.c
+++ b/py/mpz.c
@@ -992,11 +992,9 @@ void mpz_not_inpl(mpz_t *dest, const mpz_t *z) {
 /* computes dest = lhs << rhs
    can have dest, lhs the same
 */
-void mpz_shl_inpl(mpz_t *dest, const mpz_t *lhs, mp_int_t rhs) {
+void mpz_shl_inpl(mpz_t *dest, const mpz_t *lhs, mp_uint_t rhs) {
     if (lhs->len == 0 || rhs == 0) {
         mpz_set(dest, lhs);
-    } else if (rhs < 0) {
-        mpz_shr_inpl(dest, lhs, -rhs);
     } else {
         mpz_need_dig(dest, lhs->len + (rhs + DIG_SIZE - 1) / DIG_SIZE);
         dest->len = mpn_shl(dest->dig, lhs->dig, lhs->len, rhs);
@@ -1007,11 +1005,9 @@ void mpz_shl_inpl(mpz_t *dest, const mpz_t *lhs, mp_int_t rhs) {
 /* computes dest = lhs >> rhs
    can have dest, lhs the same
 */
-void mpz_shr_inpl(mpz_t *dest, const mpz_t *lhs, mp_int_t rhs) {
+void mpz_shr_inpl(mpz_t *dest, const mpz_t *lhs, mp_uint_t rhs) {
     if (lhs->len == 0 || rhs == 0) {
         mpz_set(dest, lhs);
-    } else if (rhs < 0) {
-        mpz_shl_inpl(dest, lhs, -rhs);
     } else {
         mpz_need_dig(dest, lhs->len);
         dest->len = mpn_shr(dest->dig, lhs->dig, lhs->len, rhs);
diff --git a/py/mpz.h b/py/mpz.h
index e287cdd10..b2dd88acf 100644
--- a/py/mpz.h
+++ b/py/mpz.h
@@ -112,8 +112,8 @@ int mpz_cmp(const mpz_t *lhs, const mpz_t *rhs);
 void mpz_abs_inpl(mpz_t *dest, const mpz_t *z);
 void mpz_neg_inpl(mpz_t *dest, const mpz_t *z);
 void mpz_not_inpl(mpz_t *dest, const mpz_t *z);
-void mpz_shl_inpl(mpz_t *dest, const mpz_t *lhs, mp_int_t rhs);
-void mpz_shr_inpl(mpz_t *dest, const mpz_t *lhs, mp_int_t rhs);
+void mpz_shl_inpl(mpz_t *dest, const mpz_t *lhs, mp_uint_t rhs);
+void mpz_shr_inpl(mpz_t *dest, const mpz_t *lhs, mp_uint_t rhs);
 void mpz_add_inpl(mpz_t *dest, const mpz_t *lhs, const mpz_t *rhs);
 void mpz_sub_inpl(mpz_t *dest, const mpz_t *lhs, const mpz_t *rhs);
 void mpz_mul_inpl(mpz_t *dest, const mpz_t *lhs, const mpz_t *rhs);
-- 
GitLab