From 9ae51257bd40b1f010c2abbfb0a38b6d44860ea8 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Thu, 10 Mar 2016 21:52:56 +0000
Subject: [PATCH] py: Use MP_SMALL_INT_POSITIVE_MASK to check if uint fits in a
 small int.

Using the original WORD_MSBIT_HIGH-logic resulted in errors when the
object model is not REPR_A or REPR_C.
---
 py/objint.c          | 6 +++---
 py/objint_longlong.c | 6 +++---
 py/objint_mpz.c      | 6 +++---
 3 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/py/objint.c b/py/objint.c
index 46290a36f..9f948a145 100644
--- a/py/objint.c
+++ b/py/objint.c
@@ -311,9 +311,9 @@ mp_obj_t mp_obj_new_int_from_ull(unsigned long long val) {
 }
 
 mp_obj_t mp_obj_new_int_from_uint(mp_uint_t value) {
-    // SMALL_INT accepts only signed numbers, of one bit less size
-    // then word size, which totals 2 bits less for unsigned numbers.
-    if ((value & (WORD_MSBIT_HIGH | (WORD_MSBIT_HIGH >> 1))) == 0) {
+    // SMALL_INT accepts only signed numbers, so make sure the input
+    // value fits completely in the small-int positive range.
+    if ((value & ~MP_SMALL_INT_POSITIVE_MASK) == 0) {
         return MP_OBJ_NEW_SMALL_INT(value);
     }
     nlr_raise(mp_obj_new_exception_msg(&mp_type_OverflowError, "small int overflow"));
diff --git a/py/objint_longlong.c b/py/objint_longlong.c
index 28d415e69..f10e46447 100644
--- a/py/objint_longlong.c
+++ b/py/objint_longlong.c
@@ -223,9 +223,9 @@ mp_obj_t mp_obj_new_int(mp_int_t value) {
 }
 
 mp_obj_t mp_obj_new_int_from_uint(mp_uint_t value) {
-    // SMALL_INT accepts only signed numbers, of one bit less size
-    // than word size, which totals 2 bits less for unsigned numbers.
-    if ((value & (WORD_MSBIT_HIGH | (WORD_MSBIT_HIGH >> 1))) == 0) {
+    // SMALL_INT accepts only signed numbers, so make sure the input
+    // value fits completely in the small-int positive range.
+    if ((value & ~MP_SMALL_INT_POSITIVE_MASK) == 0) {
         return MP_OBJ_NEW_SMALL_INT(value);
     }
     return mp_obj_new_int_from_ll(value);
diff --git a/py/objint_mpz.c b/py/objint_mpz.c
index 249994877..dc083827c 100644
--- a/py/objint_mpz.c
+++ b/py/objint_mpz.c
@@ -357,9 +357,9 @@ mp_obj_t mp_obj_new_int_from_ull(unsigned long long val) {
 }
 
 mp_obj_t mp_obj_new_int_from_uint(mp_uint_t value) {
-    // SMALL_INT accepts only signed numbers, of one bit less size
-    // than word size, which totals 2 bits less for unsigned numbers.
-    if ((value & (WORD_MSBIT_HIGH | (WORD_MSBIT_HIGH >> 1))) == 0) {
+    // SMALL_INT accepts only signed numbers, so make sure the input
+    // value fits completely in the small-int positive range.
+    if ((value & ~MP_SMALL_INT_POSITIVE_MASK) == 0) {
         return MP_OBJ_NEW_SMALL_INT(value);
     }
     return mp_obj_new_int_from_ull(value);
-- 
GitLab