@@ -238,11 +238,12 @@ _PyLong_IsSmallInt(const PyLongObject *op)
238238{
239239 assert (PyLong_Check (op ));
240240 bool is_small_int = (op -> long_value .lv_tag & IMMORTALITY_BIT_MASK ) != 0 ;
241- assert (PyLong_CheckExact (op ) || (!is_small_int ));
242- assert (_Py_IsImmortal (op ) || (!is_small_int ));
243- assert ((_PyLong_IsCompact (op )
244- && _PY_IS_SMALL_INT (_PyLong_CompactValue (op )))
245- || (!is_small_int ));
241+ if (is_small_int ) {
242+ assert (PyLong_CheckExact (op ));
243+ assert (_Py_IsImmortal (op ));
244+ assert ((_PyLong_IsCompact (op )
245+ && _PY_IS_SMALL_INT (_PyLong_CompactValue (op ))));
246+ }
246247 return is_small_int ;
247248}
248249
@@ -285,6 +286,14 @@ _PyLong_SameSign(const PyLongObject *a, const PyLongObject *b)
285286 return (a -> long_value .lv_tag & SIGN_MASK ) == (b -> long_value .lv_tag & SIGN_MASK );
286287}
287288
289+ /* Initialize the tag of a freshly-allocated int. */
290+ static inline void
291+ _PyLong_InitTag (PyLongObject * op )
292+ {
293+ assert (PyLong_Check (op ));
294+ op -> long_value .lv_tag = SIGN_ZERO ; /* non-immortal zero */
295+ }
296+
288297#define TAG_FROM_SIGN_AND_SIZE (sign , size ) \
289298 ((uintptr_t)(1 - (sign)) | ((uintptr_t)(size) << NON_SIZE_BITS))
290299
@@ -294,13 +303,15 @@ _PyLong_SetSignAndDigitCount(PyLongObject *op, int sign, Py_ssize_t size)
294303 assert (size >= 0 );
295304 assert (-1 <= sign && sign <= 1 );
296305 assert (sign != 0 || size == 0 );
306+ assert (!_PyLong_IsSmallInt (op ));
297307 op -> long_value .lv_tag = TAG_FROM_SIGN_AND_SIZE (sign , size );
298308}
299309
300310static inline void
301311_PyLong_SetDigitCount (PyLongObject * op , Py_ssize_t size )
302312{
303313 assert (size >= 0 );
314+ assert (!_PyLong_IsSmallInt (op ));
304315 op -> long_value .lv_tag = (((size_t )size ) << NON_SIZE_BITS ) | (op -> long_value .lv_tag & SIGN_MASK );
305316}
306317
0 commit comments