Skip to content

Commit 233fd00

Browse files
authored
gh-128863: Deprecate _PyLong_FromDigits() function (#127939)
1 parent 3d8fc8b commit 233fd00

File tree

5 files changed

+22
-6
lines changed

5 files changed

+22
-6
lines changed

Doc/deprecations/c-api-pending-removal-in-3.18.rst

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ Pending removal in Python 3.18
77
* :c:func:`!_PyDict_GetItemStringWithError`: use :c:func:`PyDict_GetItemStringRef`.
88
* :c:func:`!_PyDict_Pop()`: :c:func:`PyDict_Pop`.
99
* :c:func:`!_PyLong_Sign()`: use :c:func:`PyLong_GetSign`.
10-
* :c:func:`!_PyLong_New`: use :c:func:`PyLongWriter_Create`.
10+
* :c:func:`!_PyLong_FromDigits` and :c:func:`!_PyLong_New`:
11+
use :c:func:`PyLongWriter_Create`.
1112
* :c:func:`!_PyThreadState_UncheckedGet`: use :c:func:`PyThreadState_GetUnchecked`.
1213
* :c:func:`!_PyUnicode_AsString`: use :c:func:`PyUnicode_AsUTF8`.
1314
* :c:func:`!_Py_HashPointer`: use :c:func:`Py_HashPointer`.

Doc/whatsnew/3.14.rst

+2-1
Original file line numberDiff line numberDiff line change
@@ -1396,7 +1396,8 @@ Deprecated
13961396
* :c:func:`!_PyDict_GetItemStringWithError`: use :c:func:`PyDict_GetItemStringRef`.
13971397
* :c:func:`!_PyDict_Pop()`: use :c:func:`PyDict_Pop`.
13981398
* :c:func:`!_PyLong_Sign()`: use :c:func:`PyLong_GetSign`.
1399-
* :c:func:`!_PyLong_New`: use :c:func:`PyLongWriter_Create`.
1399+
* :c:func:`!_PyLong_FromDigits` and :c:func:`!_PyLong_New`:
1400+
use :c:func:`PyLongWriter_Create`.
14001401
* :c:func:`!_PyThreadState_UncheckedGet`: use :c:func:`PyThreadState_GetUnchecked`.
14011402
* :c:func:`!_PyUnicode_AsString`: use :c:func:`PyUnicode_AsUTF8`.
14021403
* :c:func:`!_Py_HashPointer`: use :c:func:`Py_HashPointer`.

Include/cpython/longintrepr.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ Py_DEPRECATED(3.14) PyAPI_FUNC(PyLongObject*) _PyLong_New(Py_ssize_t);
105105
// Return a copy of src.
106106
PyAPI_FUNC(PyObject*) _PyLong_Copy(PyLongObject *src);
107107

108-
PyAPI_FUNC(PyLongObject*) _PyLong_FromDigits(
108+
Py_DEPRECATED(3.14) PyAPI_FUNC(PyLongObject*) _PyLong_FromDigits(
109109
int negative,
110110
Py_ssize_t digit_count,
111111
digit *digits);

Misc/NEWS.d/next/C_API/2025-01-15-11-42-07.gh-issue-128863.C9MkB_.rst

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ Python 3.18:
55
* :c:func:`!_PyDict_GetItemStringWithError`: use :c:func:`PyDict_GetItemStringRef`.
66
* :c:func:`!_PyDict_Pop()`: use :c:func:`PyDict_Pop`.
77
* :c:func:`!_PyLong_Sign()`: use :c:func:`PyLong_GetSign`.
8-
* :c:func:`!_PyLong_New`: use :c:func:`PyLongWriter_Create`.
8+
* :c:func:`!_PyLong_FromDigits` and :c:func:`!_PyLong_New`:
9+
use :c:func:`PyLongWriter_Create`.
910
* :c:func:`!_PyThreadState_UncheckedGet`: use :c:func:`PyThreadState_GetUnchecked`.
1011
* :c:func:`!_PyUnicode_AsString`: use :c:func:`PyUnicode_AsUTF8`.
1112
* :c:func:`!_Py_HashPointer`: use :c:func:`Py_HashPointer`.

Objects/longobject.c

+15-2
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,6 @@ _PyLong_FromDigits(int negative, Py_ssize_t digit_count, digit *digits)
205205
}
206206
PyLongObject *result = long_alloc(digit_count);
207207
if (result == NULL) {
208-
PyErr_NoMemory();
209208
return NULL;
210209
}
211210
_PyLong_SetSignAndDigitCount(result, negative?-1:1, digit_count);
@@ -217,15 +216,29 @@ PyObject *
217216
_PyLong_Copy(PyLongObject *src)
218217
{
219218
assert(src != NULL);
219+
int sign;
220220

221221
if (_PyLong_IsCompact(src)) {
222222
stwodigits ival = medium_value(src);
223223
if (IS_SMALL_INT(ival)) {
224224
return get_small_int((sdigit)ival);
225225
}
226+
sign = _PyLong_CompactSign(src);
227+
}
228+
else {
229+
sign = _PyLong_NonCompactSign(src);
226230
}
231+
227232
Py_ssize_t size = _PyLong_DigitCount(src);
228-
return (PyObject *)_PyLong_FromDigits(_PyLong_IsNegative(src), size, src->long_value.ob_digit);
233+
PyLongObject *result = long_alloc(size);
234+
235+
if (result == NULL) {
236+
return NULL;
237+
}
238+
_PyLong_SetSignAndDigitCount(result, sign, size);
239+
memcpy(result->long_value.ob_digit, src->long_value.ob_digit,
240+
size * sizeof(digit));
241+
return (PyObject *)result;
229242
}
230243

231244
static PyObject *

0 commit comments

Comments
 (0)