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>
--- /dev/null
+Add fast path for medium-size integers in :c:func:`PyLong_FromUnsignedLong`,
+:c:func:`PyLong_FromUnsignedLongLong` and :c:func:`PyLong_FromSize_t`.
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; \