From d6b31e4578a9f7ed4f970774fe91eeb811b1d475 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Thu, 7 Jan 2016 14:29:12 +0000
Subject: [PATCH] py: Change mp_obj_int_is_positive to more general
 mp_obj_int_sign.

This function returns the sign (-1, 0 or 1) of the integer object.
---
 py/mpprint.c         |  2 +-
 py/objint.c          | 11 +++++++++--
 py/objint.h          |  2 +-
 py/objint_longlong.c | 17 +++++++++++++----
 py/objint_mpz.c      | 19 ++++++++++++++++---
 5 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/py/mpprint.c b/py/mpprint.c
index 19575f8a8..206cf2aa5 100644
--- a/py/mpprint.c
+++ b/py/mpprint.c
@@ -217,7 +217,7 @@ int mp_print_mp_int(const mp_print_t *print, mp_obj_t x, int base, int base_char
     char prefix_buf[4];
     char *prefix = prefix_buf;
 
-    if (mp_obj_int_is_positive(x)) {
+    if (mp_obj_int_sign(x) > 0) {
         if (flags & PF_FLAG_SHOW_SIGN) {
             *prefix++ = '+';
         } else if (flags & PF_FLAG_SPACE_SIGN) {
diff --git a/py/objint.c b/py/objint.c
index f3d699c45..db8eaa48d 100644
--- a/py/objint.c
+++ b/py/objint.c
@@ -259,8 +259,15 @@ char *mp_obj_int_formatted(char **buf, mp_uint_t *buf_size, mp_uint_t *fmt_size,
 
 #if MICROPY_LONGINT_IMPL == MICROPY_LONGINT_IMPL_NONE
 
-bool mp_obj_int_is_positive(mp_obj_t self_in) {
-    return mp_obj_get_int(self_in) >= 0;
+int mp_obj_int_sign(mp_obj_t self_in) {
+    mp_int_t val = mp_obj_get_int(self_in);
+    if (val < 0) {
+        return -1;
+    } else if (val > 0) {
+        return 1;
+    } else {
+        return 0;
+    }
 }
 
 // This must handle int and bool types, and must raise a
diff --git a/py/objint.h b/py/objint.h
index 09cf7c86d..c79eb874a 100644
--- a/py/objint.h
+++ b/py/objint.h
@@ -57,7 +57,7 @@ char *mp_obj_int_formatted_impl(char **buf, mp_uint_t *buf_size, mp_uint_t *fmt_
                                 int base, const char *prefix, char base_char, char comma);
 mp_int_t mp_obj_int_hash(mp_obj_t self_in);
 void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, mp_uint_t len, byte *buf);
-bool mp_obj_int_is_positive(mp_obj_t self_in);
+int mp_obj_int_sign(mp_obj_t self_in);
 mp_obj_t mp_obj_int_abs(mp_obj_t self_in);
 mp_obj_t mp_obj_int_unary_op(mp_uint_t op, mp_obj_t o_in);
 mp_obj_t mp_obj_int_binary_op(mp_uint_t op, mp_obj_t lhs_in, mp_obj_t rhs_in);
diff --git a/py/objint_longlong.c b/py/objint_longlong.c
index ea19b6804..28d415e69 100644
--- a/py/objint_longlong.c
+++ b/py/objint_longlong.c
@@ -71,12 +71,21 @@ void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, mp_uint_t len,
     }
 }
 
-bool mp_obj_int_is_positive(mp_obj_t self_in) {
+int mp_obj_int_sign(mp_obj_t self_in) {
+    mp_longint_impl_t val;
     if (MP_OBJ_IS_SMALL_INT(self_in)) {
-        return MP_OBJ_SMALL_INT_VALUE(self_in) >= 0;
+        val = MP_OBJ_SMALL_INT_VALUE(self_in);
+    } else {
+        mp_obj_int_t *self = self_in;
+        val = self->val;
+    }
+    if (val < 0) {
+        return -1;
+    } else if (val > 0) {
+        return 1;
+    } else {
+        return 0;
     }
-    mp_obj_int_t *self = self_in;
-    return self->val >= 0;
 }
 
 // This must handle int and bool types, and must raise a
diff --git a/py/objint_mpz.c b/py/objint_mpz.c
index 385bbc5e3..249994877 100644
--- a/py/objint_mpz.c
+++ b/py/objint_mpz.c
@@ -113,12 +113,25 @@ void mp_obj_int_to_bytes_impl(mp_obj_t self_in, bool big_endian, mp_uint_t len,
     mpz_as_bytes(&self->mpz, big_endian, len, buf);
 }
 
-bool mp_obj_int_is_positive(mp_obj_t self_in) {
+int mp_obj_int_sign(mp_obj_t self_in) {
     if (MP_OBJ_IS_SMALL_INT(self_in)) {
-        return MP_OBJ_SMALL_INT_VALUE(self_in) >= 0;
+        mp_int_t val = MP_OBJ_SMALL_INT_VALUE(self_in);
+        if (val < 0) {
+            return -1;
+        } else if (val > 0) {
+            return 1;
+        } else {
+            return 0;
+        }
     }
     mp_obj_int_t *self = MP_OBJ_TO_PTR(self_in);
-    return !self->mpz.neg;
+    if (self->mpz.len == 0) {
+        return 0;
+    } else if (self->mpz.neg == 0) {
+        return 1;
+    } else {
+        return -1;
+    }
 }
 
 // This must handle int and bool types, and must raise a
-- 
GitLab