mirror of
https://github.com/python/cpython.git
synced 2025-08-30 21:48:47 +00:00
gh-127119: Faster check for small ints in long_dealloc (GH-127620)
This commit is contained in:
parent
3a974e39d5
commit
a29221675e
6 changed files with 48 additions and 45 deletions
|
@ -159,13 +159,14 @@ PyAPI_FUNC(int) _PyLong_Size_t_Converter(PyObject *, void *);
|
|||
|
||||
/* Long value tag bits:
|
||||
* 0-1: Sign bits value = (1-sign), ie. negative=2, positive=0, zero=1.
|
||||
* 2: Reserved for immortality bit
|
||||
* 2: Set to 1 for the small ints
|
||||
* 3+ Unsigned digit count
|
||||
*/
|
||||
#define SIGN_MASK 3
|
||||
#define SIGN_ZERO 1
|
||||
#define SIGN_NEGATIVE 2
|
||||
#define NON_SIZE_BITS 3
|
||||
#define IMMORTALITY_BIT_MASK (1 << 2)
|
||||
|
||||
/* The functions _PyLong_IsCompact and _PyLong_CompactValue are defined
|
||||
* in Include/cpython/longobject.h, since they need to be inline.
|
||||
|
@ -196,7 +197,7 @@ PyAPI_FUNC(int) _PyLong_Size_t_Converter(PyObject *, void *);
|
|||
static inline int
|
||||
_PyLong_IsNonNegativeCompact(const PyLongObject* op) {
|
||||
assert(PyLong_Check(op));
|
||||
return op->long_value.lv_tag <= (1 << NON_SIZE_BITS);
|
||||
return ((op->long_value.lv_tag & ~IMMORTALITY_BIT_MASK) <= (1 << NON_SIZE_BITS));
|
||||
}
|
||||
|
||||
|
||||
|
@ -298,7 +299,7 @@ _PyLong_FlipSign(PyLongObject *op) {
|
|||
.long_value = { \
|
||||
.lv_tag = TAG_FROM_SIGN_AND_SIZE( \
|
||||
(val) == 0 ? 0 : ((val) < 0 ? -1 : 1), \
|
||||
(val) == 0 ? 0 : 1), \
|
||||
(val) == 0 ? 0 : 1) | IMMORTALITY_BIT_MASK, \
|
||||
{ ((val) >= 0 ? (val) : -(val)) }, \
|
||||
} \
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue