@@ -3611,24 +3611,28 @@ long_richcompare(PyObject *self, PyObject *other, int op)
3611
3611
Py_RETURN_RICHCOMPARE (result , 0 , op );
3612
3612
}
3613
3613
3614
+ static inline int
3615
+ /// Return 1 if the object is one of the immortal small ints
3616
+ _long_is_small_int (PyObject * op )
3617
+ {
3618
+ return (((PyObject * )(& _PyLong_SMALL_INTS [0 ]) <= op )
3619
+ && (op <= (PyObject * )& _PyLong_SMALL_INTS [_PY_NSMALLNEGINTS + _PY_NSMALLPOSINTS ]));
3620
+ }
3614
3621
static void
3615
3622
long_dealloc (PyObject * self )
3616
3623
{
3617
- /* This should never get called, but we also don't want to SEGV if
3618
- * we accidentally decref small Ints out of existence. Instead,
3619
- * since small Ints are immortal, re-set the reference count.
3620
- */
3621
- PyLongObject * pylong = (PyLongObject * )self ;
3622
- if (pylong && _PyLong_IsCompact (pylong )) {
3623
- stwodigits ival = medium_value (pylong );
3624
- if (IS_SMALL_INT (ival )) {
3625
- PyLongObject * small_pylong = (PyLongObject * )get_small_int ((sdigit )ival );
3626
- if (pylong == small_pylong ) {
3627
- _Py_SetImmortal (self );
3628
- return ;
3629
- }
3630
- }
3624
+ #ifndef Py_GIL_DISABLED
3625
+ if (_long_is_small_int (self )) {
3626
+ /* This should never get called, but we also don't want to SEGV if
3627
+ * we accidentally decref small Ints out of existence. Instead,
3628
+ * since small Ints are immortal, re-set the reference count.
3629
+ *
3630
+ * See PEP 683, section Accidental De-Immortalizing for details
3631
+ */
3632
+ _Py_SetImmortal (self );
3633
+ return ;
3631
3634
}
3635
+ #endif
3632
3636
Py_TYPE (self )-> tp_free (self );
3633
3637
}
3634
3638
0 commit comments