[Python-checkins] bpo-37812: Convert CHECK_SMALL_INT macro to a function so the return is explicit. (GH-15216)

Raymond Hettinger webhook-mailer at python.org
Sat Aug 24 13:19:41 EDT 2019


https://github.com/python/cpython/commit/5e63ab05f114987478a21612d918a1c0276fe9d2
commit: 5e63ab05f114987478a21612d918a1c0276fe9d2
branch: master
author: Greg Price <gnprice at gmail.com>
committer: Raymond Hettinger <rhettinger at users.noreply.github.com>
date: 2019-08-24T10:19:37-07:00
summary:

bpo-37812: Convert CHECK_SMALL_INT macro to a function so the return is explicit. (GH-15216)

files:
A Misc/NEWS.d/next/Core and Builtins/2019-08-23-22-46-25.bpo-37812.vsWZwS.rst
M Objects/longobject.c

diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-08-23-22-46-25.bpo-37812.vsWZwS.rst b/Misc/NEWS.d/next/Core and Builtins/2019-08-23-22-46-25.bpo-37812.vsWZwS.rst
new file mode 100644
index 000000000000..90c3ff3f7ef9
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2019-08-23-22-46-25.bpo-37812.vsWZwS.rst	
@@ -0,0 +1,3 @@
+The ``CHECK_SMALL_INT`` macro used inside :file:`Object/longobject.c` has
+been replaced with an explicit ``return`` at each call site, conditioned on
+a ``static inline`` function ``is_small_int``.
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 3978f5c4a167..74037be7a1ea 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -41,6 +41,13 @@ PyObject *_PyLong_One = NULL;
    -NSMALLNEGINTS (inclusive) to NSMALLPOSINTS (not inclusive).
 */
 static PyLongObject small_ints[NSMALLNEGINTS + NSMALLPOSINTS];
+
+static inline int
+is_small_int(long long ival)
+{
+    return -NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS;
+}
+
 #ifdef COUNT_ALLOCS
 Py_ssize_t _Py_quick_int_allocs, _Py_quick_neg_int_allocs;
 #endif
@@ -49,7 +56,7 @@ static PyObject *
 get_small_int(sdigit ival)
 {
     PyObject *v;
-    assert(-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS);
+    assert(is_small_int(ival));
     v = (PyObject *)&small_ints[ival + NSMALLNEGINTS];
     Py_INCREF(v);
 #ifdef COUNT_ALLOCS
@@ -60,17 +67,13 @@ get_small_int(sdigit ival)
 #endif
     return v;
 }
-#define CHECK_SMALL_INT(ival) \
-    do if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) { \
-        return get_small_int((sdigit)ival); \
-    } while(0)
 
 static PyLongObject *
 maybe_small_long(PyLongObject *v)
 {
     if (v && Py_ABS(Py_SIZE(v)) <= 1) {
         sdigit ival = MEDIUM_VALUE(v);
-        if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
+        if (is_small_int(ival)) {
             Py_DECREF(v);
             return (PyLongObject *)get_small_int(ival);
         }
@@ -78,7 +81,8 @@ maybe_small_long(PyLongObject *v)
     return v;
 }
 #else
-#define CHECK_SMALL_INT(ival)
+#define is_small_int(ival) 0
+#define get_small_int(ival) (assert(0), NULL)
 #define maybe_small_long(val) (val)
 #endif
 
@@ -293,7 +297,9 @@ _PyLong_Copy(PyLongObject *src)
         i = -(i);
     if (i < 2) {
         sdigit ival = MEDIUM_VALUE(src);
-        CHECK_SMALL_INT(ival);
+        if (is_small_int(ival)) {
+            return get_small_int(ival);
+        }
     }
     result = _PyLong_New(i);
     if (result != NULL) {
@@ -315,7 +321,9 @@ PyLong_FromLong(long ival)
     int ndigits = 0;
     int sign;
 
-    CHECK_SMALL_INT(ival);
+    if (is_small_int(ival)) {
+        return get_small_int((sdigit)ival);
+    }
 
     if (ival < 0) {
         /* negate: can't write this as abs_ival = -ival since that
@@ -1146,7 +1154,10 @@ PyLong_FromLongLong(long long ival)
     int ndigits = 0;
     int negative = 0;
 
-    CHECK_SMALL_INT(ival);
+    if (is_small_int(ival)) {
+        return get_small_int((sdigit)ival);
+    }
+
     if (ival < 0) {
         /* avoid signed overflow on negation;  see comments
            in PyLong_FromLong above. */
@@ -1218,7 +1229,10 @@ PyLong_FromSsize_t(Py_ssize_t ival)
     int ndigits = 0;
     int negative = 0;
 
-    CHECK_SMALL_INT(ival);
+    if (is_small_int(ival)) {
+        return get_small_int((sdigit)ival);
+    }
+
     if (ival < 0) {
         /* avoid signed overflow when ival = SIZE_T_MIN */
         abs_ival = (size_t)(-1-ival)+1;



More information about the Python-checkins mailing list