diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index a33762402491b7..f6e59eeea49dcb 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -17,6 +17,7 @@ extern "C" { extern PyStatus _PyLong_InitTypes(PyInterpreterState *); extern void _PyLong_FiniTypes(PyInterpreterState *interp); +extern void _PyLong_ExactDealloc(PyObject *op); /* other API */ diff --git a/Objects/longobject.c b/Objects/longobject.c index c104dcc14f986e..7f198662e29e4a 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -36,11 +36,17 @@ medium_value(PyLongObject *x) #define IS_SMALL_INT(ival) (-_PY_NSMALLNEGINTS <= (ival) && (ival) < _PY_NSMALLPOSINTS) #define IS_SMALL_UINT(ival) ((ival) < _PY_NSMALLPOSINTS) +void +_PyLong_ExactDealloc(PyObject *op) +{ + PyObject_Free(op); +} + static inline void _Py_DECREF_INT(PyLongObject *op) { assert(PyLong_CheckExact(op)); - _Py_DECREF_SPECIALIZED((PyObject *)op, PyObject_Free); + _Py_DECREF_SPECIALIZED((PyObject *)op, _PyLong_ExactDealloc); } static inline int diff --git a/Python/ceval.c b/Python/ceval.c index 45754ffbe7cb4a..4f705f853405c5 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -1977,8 +1977,8 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int STAT_INC(BINARY_OP, hit); PyObject *prod = _PyLong_Multiply((PyLongObject *)left, (PyLongObject *)right); SET_SECOND(prod); - _Py_DECREF_SPECIALIZED(right, PyObject_Free); - _Py_DECREF_SPECIALIZED(left, PyObject_Free); + _Py_DECREF_SPECIALIZED(right, _PyLong_ExactDealloc); + _Py_DECREF_SPECIALIZED(left, _PyLong_ExactDealloc); STACK_SHRINK(1); if (prod == NULL) { goto error; @@ -2017,8 +2017,8 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int STAT_INC(BINARY_OP, hit); PyObject *sub = _PyLong_Subtract((PyLongObject *)left, (PyLongObject *)right); SET_SECOND(sub); - _Py_DECREF_SPECIALIZED(right, PyObject_Free); - _Py_DECREF_SPECIALIZED(left, PyObject_Free); + _Py_DECREF_SPECIALIZED(right, _PyLong_ExactDealloc); + _Py_DECREF_SPECIALIZED(left, _PyLong_ExactDealloc); STACK_SHRINK(1); if (sub == NULL) { goto error; @@ -2132,8 +2132,8 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int STAT_INC(BINARY_OP, hit); PyObject *sum = _PyLong_Add((PyLongObject *)left, (PyLongObject *)right); SET_SECOND(sum); - _Py_DECREF_SPECIALIZED(right, PyObject_Free); - _Py_DECREF_SPECIALIZED(left, PyObject_Free); + _Py_DECREF_SPECIALIZED(right, _PyLong_ExactDealloc); + _Py_DECREF_SPECIALIZED(left, _PyLong_ExactDealloc); STACK_SHRINK(1); if (sum == NULL) { goto error; @@ -2192,7 +2192,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int assert(res != NULL); Py_INCREF(res); STACK_SHRINK(1); - _Py_DECREF_SPECIALIZED(sub, PyObject_Free); + _Py_DECREF_SPECIALIZED(sub, _PyLong_ExactDealloc); SET_TOP(res); Py_DECREF(list); JUMPBY(INLINE_CACHE_ENTRIES_BINARY_SUBSCR); @@ -2217,7 +2217,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int assert(res != NULL); Py_INCREF(res); STACK_SHRINK(1); - _Py_DECREF_SPECIALIZED(sub, PyObject_Free); + _Py_DECREF_SPECIALIZED(sub, _PyLong_ExactDealloc); SET_TOP(res); Py_DECREF(tuple); JUMPBY(INLINE_CACHE_ENTRIES_BINARY_SUBSCR); @@ -2359,7 +2359,7 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int STACK_SHRINK(3); assert(old_value != NULL); Py_DECREF(old_value); - _Py_DECREF_SPECIALIZED(sub, PyObject_Free); + _Py_DECREF_SPECIALIZED(sub, _PyLong_ExactDealloc); Py_DECREF(list); JUMPBY(INLINE_CACHE_ENTRIES_STORE_SUBSCR); NOTRACE_DISPATCH(); @@ -3795,8 +3795,8 @@ _PyEval_EvalFrameDefault(PyThreadState *tstate, _PyInterpreterFrame *frame, int JUMPBY(INLINE_CACHE_ENTRIES_COMPARE_OP); NEXTOPARG(); STACK_SHRINK(2); - _Py_DECREF_SPECIALIZED(left, PyObject_Free); - _Py_DECREF_SPECIALIZED(right, PyObject_Free); + _Py_DECREF_SPECIALIZED(left, _PyLong_ExactDealloc); + _Py_DECREF_SPECIALIZED(right, _PyLong_ExactDealloc); assert(opcode == POP_JUMP_FORWARD_IF_FALSE || opcode == POP_JUMP_BACKWARD_IF_FALSE || opcode == POP_JUMP_FORWARD_IF_TRUE ||