]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.14] gh-126835: Fix _PY_IS_SMALL_INT() macro (GH-146631) (#147187)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Tue, 31 Mar 2026 13:27:11 +0000 (15:27 +0200)
committerGitHub <noreply@github.com>
Tue, 31 Mar 2026 13:27:11 +0000 (13:27 +0000)
gh-126835: Fix _PY_IS_SMALL_INT() macro (GH-146631)
(cherry picked from commit adf2c47911b35134cf108c24a3cc7794b7755aac)

Co-authored-by: Victor Stinner <vstinner@python.org>
Include/internal/pycore_long.h
Objects/longobject.c
Python/flowgraph.c

index 3196d1b82084b9248aad412b96cc684cbc3f7edf..ec84dc167a868cd15c80666df557668121c3af67 100644 (file)
@@ -64,7 +64,8 @@ PyAPI_FUNC(void) _PyLong_ExactDealloc(PyObject *self);
 #  error "_PY_NSMALLPOSINTS must be greater than or equal to 257"
 #endif
 
-#define _PY_IS_SMALL_INT(val) ((val) >= 0 && (val) < 256 && (val) < _PY_NSMALLPOSINTS)
+#define _PY_IS_SMALL_INT(val) \
+    (-_PY_NSMALLNEGINTS <= (val) && (val) < _PY_NSMALLPOSINTS)
 
 // Return a reference to the immortal zero singleton.
 // The function cannot return NULL.
index 803da9f590be65622b941b16db977511a013722c..3d936cb92565c01e8f66017cd4c1227c419fb391 100644 (file)
@@ -24,7 +24,7 @@ class int "PyObject *" "&PyLong_Type"
 
 #define medium_value(x) ((stwodigits)_PyLong_CompactValue(x))
 
-#define IS_SMALL_INT(ival) (-_PY_NSMALLNEGINTS <= (ival) && (ival) < _PY_NSMALLPOSINTS)
+#define IS_SMALL_INT(ival) _PY_IS_SMALL_INT(ival)
 #define IS_SMALL_UINT(ival) ((ival) < _PY_NSMALLPOSINTS)
 
 #define _MAX_STR_DIGITS_ERROR_FMT_TO_INT "Exceeds the limit (%d digits) for integer string conversion: value has %zd digits; use sys.set_int_max_str_digits() to increase the limit"
index 04cd7a003da963d681f6bb50612c571d4c130952..87e90ddeef91d5869ea6625e47de599e84f5338a 100644 (file)
@@ -1397,7 +1397,7 @@ maybe_instr_make_load_smallint(cfg_instr *instr, PyObject *newconst,
         if (val == -1 && PyErr_Occurred()) {
             return -1;
         }
-        if (!overflow && _PY_IS_SMALL_INT(val)) {
+        if (!overflow && _PY_IS_SMALL_INT(val) && 0 <= val && val <= 255) {
             assert(_Py_IsImmortal(newconst));
             INSTR_SET_OP1(instr, LOAD_SMALL_INT, (int)val);
             return 1;