mirror of https://github.com/python/cpython.git
gh-129149: Add fast path in PYLONG_FROM_UINT macro for compact integers (#129168)
Add fast path in PyLong_From*() functions for compact integers. Co-authored-by: Pieter Eendebak <pieter.eendebak@gmail.com> Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com> Co-authored-by: Yan Yanchii <yyanchiy@gmail.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
parent
75f59bb629
commit
ab353b31bb
|
@ -0,0 +1,2 @@
|
|||
Add fast path for medium-size integers in :c:func:`PyLong_FromUnsignedLong`,
|
||||
:c:func:`PyLong_FromUnsignedLongLong` and :c:func:`PyLong_FromSize_t`.
|
|
@ -365,9 +365,13 @@ PyLong_FromLong(long ival)
|
|||
if (IS_SMALL_UINT(ival)) { \
|
||||
return get_small_int((sdigit)(ival)); \
|
||||
} \
|
||||
if ((ival) <= PyLong_MASK) { \
|
||||
return _PyLong_FromMedium((sdigit)(ival)); \
|
||||
} \
|
||||
/* Do shift in two steps to avoid possible undefined behavior. */ \
|
||||
INT_TYPE t = (ival) >> PyLong_SHIFT >> PyLong_SHIFT; \
|
||||
/* Count the number of Python digits. */ \
|
||||
Py_ssize_t ndigits = 0; \
|
||||
INT_TYPE t = (ival); \
|
||||
Py_ssize_t ndigits = 2; \
|
||||
while (t) { \
|
||||
++ndigits; \
|
||||
t >>= PyLong_SHIFT; \
|
||||
|
|
Loading…
Reference in New Issue