https://github.com/python/cpython/commit/233fd00f0a19d33932e35f2fb6794ecae745b780
commit: 233fd00f0a19d33932e35f2fb6794ecae745b780
branch: main
author: Sergey B Kirpichev <[email protected]>
committer: vstinner <[email protected]>
date: 2025-01-24T13:17:10+01:00
summary:
gh-128863: Deprecate _PyLong_FromDigits() function (#127939)
files:
M Doc/deprecations/c-api-pending-removal-in-3.18.rst
M Doc/whatsnew/3.14.rst
M Include/cpython/longintrepr.h
M Misc/NEWS.d/next/C_API/2025-01-15-11-42-07.gh-issue-128863.C9MkB_.rst
M Objects/longobject.c
diff --git a/Doc/deprecations/c-api-pending-removal-in-3.18.rst
b/Doc/deprecations/c-api-pending-removal-in-3.18.rst
index 361e1a9abf22d7..0689d8b4f9e959 100644
--- a/Doc/deprecations/c-api-pending-removal-in-3.18.rst
+++ b/Doc/deprecations/c-api-pending-removal-in-3.18.rst
@@ -7,7 +7,8 @@ Pending removal in Python 3.18
* :c:func:`!_PyDict_GetItemStringWithError`: use
:c:func:`PyDict_GetItemStringRef`.
* :c:func:`!_PyDict_Pop()`: :c:func:`PyDict_Pop`.
* :c:func:`!_PyLong_Sign()`: use :c:func:`PyLong_GetSign`.
- * :c:func:`!_PyLong_New`: use :c:func:`PyLongWriter_Create`.
+ * :c:func:`!_PyLong_FromDigits` and :c:func:`!_PyLong_New`:
+ use :c:func:`PyLongWriter_Create`.
* :c:func:`!_PyThreadState_UncheckedGet`: use
:c:func:`PyThreadState_GetUnchecked`.
* :c:func:`!_PyUnicode_AsString`: use :c:func:`PyUnicode_AsUTF8`.
* :c:func:`!_Py_HashPointer`: use :c:func:`Py_HashPointer`.
diff --git a/Doc/whatsnew/3.14.rst b/Doc/whatsnew/3.14.rst
index f463ed415d6a20..b3c53b78903c7f 100644
--- a/Doc/whatsnew/3.14.rst
+++ b/Doc/whatsnew/3.14.rst
@@ -1396,7 +1396,8 @@ Deprecated
* :c:func:`!_PyDict_GetItemStringWithError`: use
:c:func:`PyDict_GetItemStringRef`.
* :c:func:`!_PyDict_Pop()`: use :c:func:`PyDict_Pop`.
* :c:func:`!_PyLong_Sign()`: use :c:func:`PyLong_GetSign`.
- * :c:func:`!_PyLong_New`: use :c:func:`PyLongWriter_Create`.
+ * :c:func:`!_PyLong_FromDigits` and :c:func:`!_PyLong_New`:
+ use :c:func:`PyLongWriter_Create`.
* :c:func:`!_PyThreadState_UncheckedGet`: use
:c:func:`PyThreadState_GetUnchecked`.
* :c:func:`!_PyUnicode_AsString`: use :c:func:`PyUnicode_AsUTF8`.
* :c:func:`!_Py_HashPointer`: use :c:func:`Py_HashPointer`.
diff --git a/Include/cpython/longintrepr.h b/Include/cpython/longintrepr.h
index f0d3d0d2b37e4f..4dd82600d562ee 100644
--- a/Include/cpython/longintrepr.h
+++ b/Include/cpython/longintrepr.h
@@ -105,7 +105,7 @@ Py_DEPRECATED(3.14) PyAPI_FUNC(PyLongObject*)
_PyLong_New(Py_ssize_t);
// Return a copy of src.
PyAPI_FUNC(PyObject*) _PyLong_Copy(PyLongObject *src);
-PyAPI_FUNC(PyLongObject*) _PyLong_FromDigits(
+Py_DEPRECATED(3.14) PyAPI_FUNC(PyLongObject*) _PyLong_FromDigits(
int negative,
Py_ssize_t digit_count,
digit *digits);
diff --git
a/Misc/NEWS.d/next/C_API/2025-01-15-11-42-07.gh-issue-128863.C9MkB_.rst
b/Misc/NEWS.d/next/C_API/2025-01-15-11-42-07.gh-issue-128863.C9MkB_.rst
index 7e6a8484b8887c..b2e5664138fba2 100644
--- a/Misc/NEWS.d/next/C_API/2025-01-15-11-42-07.gh-issue-128863.C9MkB_.rst
+++ b/Misc/NEWS.d/next/C_API/2025-01-15-11-42-07.gh-issue-128863.C9MkB_.rst
@@ -5,7 +5,8 @@ Python 3.18:
* :c:func:`!_PyDict_GetItemStringWithError`: use
:c:func:`PyDict_GetItemStringRef`.
* :c:func:`!_PyDict_Pop()`: use :c:func:`PyDict_Pop`.
* :c:func:`!_PyLong_Sign()`: use :c:func:`PyLong_GetSign`.
-* :c:func:`!_PyLong_New`: use :c:func:`PyLongWriter_Create`.
+* :c:func:`!_PyLong_FromDigits` and :c:func:`!_PyLong_New`:
+ use :c:func:`PyLongWriter_Create`.
* :c:func:`!_PyThreadState_UncheckedGet`: use
:c:func:`PyThreadState_GetUnchecked`.
* :c:func:`!_PyUnicode_AsString`: use :c:func:`PyUnicode_AsUTF8`.
* :c:func:`!_Py_HashPointer`: use :c:func:`Py_HashPointer`.
diff --git a/Objects/longobject.c b/Objects/longobject.c
index b4e3a70adf2b5b..905c4695f60d4f 100644
--- a/Objects/longobject.c
+++ b/Objects/longobject.c
@@ -205,7 +205,6 @@ _PyLong_FromDigits(int negative, Py_ssize_t digit_count,
digit *digits)
}
PyLongObject *result = long_alloc(digit_count);
if (result == NULL) {
- PyErr_NoMemory();
return NULL;
}
_PyLong_SetSignAndDigitCount(result, negative?-1:1, digit_count);
@@ -217,15 +216,29 @@ PyObject *
_PyLong_Copy(PyLongObject *src)
{
assert(src != NULL);
+ int sign;
if (_PyLong_IsCompact(src)) {
stwodigits ival = medium_value(src);
if (IS_SMALL_INT(ival)) {
return get_small_int((sdigit)ival);
}
+ sign = _PyLong_CompactSign(src);
+ }
+ else {
+ sign = _PyLong_NonCompactSign(src);
}
+
Py_ssize_t size = _PyLong_DigitCount(src);
- return (PyObject *)_PyLong_FromDigits(_PyLong_IsNegative(src), size,
src->long_value.ob_digit);
+ PyLongObject *result = long_alloc(size);
+
+ if (result == NULL) {
+ return NULL;
+ }
+ _PyLong_SetSignAndDigitCount(result, sign, size);
+ memcpy(result->long_value.ob_digit, src->long_value.ob_digit,
+ size * sizeof(digit));
+ return (PyObject *)result;
}
static PyObject *
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]