From: Srinivas Reddy Thatiparthy (తాటిపర్తి శ్రీనివాస్ రెడ్డి) Date: Thu, 23 Jan 2025 14:36:52 +0000 (+0530) Subject: gh-129149: Add fast path in PYLONG_FROM_UINT macro for compact integers (#129168) X-Git-Tag: v3.14.0a5~269 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ab353b31bb300d55e845476a8e265366455d93fc;p=thirdparty%2FPython%2Fcpython.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 Co-authored-by: Sergey B Kirpichev Co-authored-by: Yan Yanchii Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> Co-authored-by: Victor Stinner --- diff --git a/Misc/NEWS.d/next/Core_and_Builtins/2025-01-22-14-24-44.gh-issue-129149.wAYu43.rst b/Misc/NEWS.d/next/Core_and_Builtins/2025-01-22-14-24-44.gh-issue-129149.wAYu43.rst new file mode 100644 index 000000000000..d946f6a2fea1 --- /dev/null +++ b/Misc/NEWS.d/next/Core_and_Builtins/2025-01-22-14-24-44.gh-issue-129149.wAYu43.rst @@ -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`. diff --git a/Objects/longobject.c b/Objects/longobject.c index 89526d5a4303..b4e3a70adf2b 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -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; \