From 3edcf743e88b4ac4431d4b0f3a66048628cf5c70 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Fri, 1 Sep 2023 09:13:07 +0200 Subject: [PATCH] gh-106320: Remove private _PyLong_Sign() (#108743) Move the private _PyLong_Sign() and _PyLong_NumBits() functions to the internal C API (pycore_long.h). Modules/_testcapi/long.c now uses the internal C API. --- Include/cpython/longobject.h | 15 --------------- Include/internal/pycore_long.h | 17 +++++++++++++++++ Modules/_io/_iomodule.c | 1 + Modules/_testcapi/long.c | 5 +++++ 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/Include/cpython/longobject.h b/Include/cpython/longobject.h index 32c40b083b7..57834173490 100644 --- a/Include/cpython/longobject.h +++ b/Include/cpython/longobject.h @@ -4,21 +4,6 @@ PyAPI_FUNC(PyObject*) PyLong_FromUnicodeObject(PyObject *u, int base); -/* _PyLong_Sign. Return 0 if v is 0, -1 if v < 0, +1 if v > 0. - v must not be NULL, and must be a normalized long. - There are no error cases. -*/ -PyAPI_FUNC(int) _PyLong_Sign(PyObject *v); - -/* _PyLong_NumBits. Return the number of bits needed to represent the - absolute value of a long. For example, this returns 1 for 1 and -1, 2 - for 2 and -2, and 2 for 3 and -3. It returns 0 for 0. - v must not be NULL, and must be a normalized long. - (size_t)-1 is returned and OverflowError set if the true result doesn't - fit in a size_t. -*/ -PyAPI_FUNC(size_t) _PyLong_NumBits(PyObject *v); - PyAPI_FUNC(int) PyUnstable_Long_IsCompact(const PyLongObject* op); PyAPI_FUNC(Py_ssize_t) PyUnstable_Long_CompactValue(const PyLongObject* op); diff --git a/Include/internal/pycore_long.h b/Include/internal/pycore_long.h index c411ac65438..3c253ed7ff5 100644 --- a/Include/internal/pycore_long.h +++ b/Include/internal/pycore_long.h @@ -58,6 +58,23 @@ PyAPI_FUNC(PyLongObject*) _PyLong_FromDigits( Py_ssize_t digit_count, digit *digits); +// _PyLong_Sign. Return 0 if v is 0, -1 if v < 0, +1 if v > 0. +// v must not be NULL, and must be a normalized long. +// There are no error cases. +// +// Export for '_pickle' shared extension. +PyAPI_FUNC(int) _PyLong_Sign(PyObject *v); + +// _PyLong_NumBits. Return the number of bits needed to represent the +// absolute value of a long. For example, this returns 1 for 1 and -1, 2 +// for 2 and -2, and 2 for 3 and -3. It returns 0 for 0. +// v must not be NULL, and must be a normalized long. +// (size_t)-1 is returned and OverflowError set if the true result doesn't +// fit in a size_t. +// +// Export for 'math' shared extension. +PyAPI_FUNC(size_t) _PyLong_NumBits(PyObject *v); + /* runtime lifecycle */ diff --git a/Modules/_io/_iomodule.c b/Modules/_io/_iomodule.c index cc844527da5..173f5b55e5f 100644 --- a/Modules/_io/_iomodule.c +++ b/Modules/_io/_iomodule.c @@ -10,6 +10,7 @@ #include "Python.h" #include "pycore_abstract.h" // _PyNumber_Index() #include "pycore_initconfig.h" // _PyStatus_OK() +#include "pycore_long.h" // _PyLong_Sign() #include "pycore_pyerrors.h" // _PyErr_ChainExceptions1() #include "pycore_pystate.h" // _PyInterpreterState_GET() diff --git a/Modules/_testcapi/long.c b/Modules/_testcapi/long.c index 6b74e0ab8e0..c1d2d42a2c4 100644 --- a/Modules/_testcapi/long.c +++ b/Modules/_testcapi/long.c @@ -1,5 +1,10 @@ +#ifndef Py_BUILD_CORE_BUILTIN +# define Py_BUILD_CORE_MODULE 1 +#endif + #include "parts.h" #include "clinic/long.c.h" +#include "pycore_long.h" // _PyLong_Sign() /*[clinic input] module _testcapi