summaryrefslogtreecommitdiffstats
path: root/Objects/longobject.c
diff options
context:
space:
mode:
authorGreg Price <gnprice@gmail.com>2019-08-24 17:19:37 (GMT)
committerRaymond Hettinger <rhettinger@users.noreply.github.com>2019-08-24 17:19:37 (GMT)
commit5e63ab05f114987478a21612d918a1c0276fe9d2 (patch)
treed92cb5253d341235ca4ef6d9487b325be7105c63 /Objects/longobject.c
parenta50f0a4c2bd997e4534162ecc1853cb54c7ae902 (diff)
downloadcpython-5e63ab05f114987478a21612d918a1c0276fe9d2.zip
cpython-5e63ab05f114987478a21612d918a1c0276fe9d2.tar.gz
cpython-5e63ab05f114987478a21612d918a1c0276fe9d2.tar.bz2
bpo-37812: Convert CHECK_SMALL_INT macro to a function so the return is explicit. (GH-15216)
Diffstat (limited to 'Objects/longobject.c')
-rw-r--r--Objects/longobject.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/Objects/longobject.c b/Objects/longobject.c
index 3978f5c..74037be 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;