diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst index 9713431688d499..36090aaf7d327b 100644 --- a/Doc/c-api/arg.rst +++ b/Doc/c-api/arg.rst @@ -70,9 +70,10 @@ There are three ways strings and buffers can be converted to C: .. note:: - For all ``#`` variants of formats (``s#``, ``y#``, etc.), the macro - :c:macro:`PY_SSIZE_T_CLEAN` must be defined before including - :file:`Python.h`. On Python 3.9 and older, the type of the length argument + From Python 3.10 to 3.12, the macro :c:macro:`PY_SSIZE_T_CLEAN` had to + be defined before including :file:`Python.h` to use all ``#`` variants of + formats (``s#``, ``y#``, etc.). + On Python 3.9 and older, the type of the length argument is :c:type:`Py_ssize_t` if the :c:macro:`PY_SSIZE_T_CLEAN` macro is defined, or int otherwise. diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst index 8de76e55cd0586..7d583774902fec 100644 --- a/Doc/c-api/intro.rst +++ b/Doc/c-api/intro.rst @@ -48,7 +48,7 @@ Include Files All function, type and macro definitions needed to use the Python/C API are included in your code by the following line:: - #define PY_SSIZE_T_CLEAN + #define PY_SSIZE_T_CLEAN /* needed until Python 3.12 */ #include This implies inclusion of the following standard headers: ````, diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index f112d268129fd1..55b3ac88b4eca4 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -1,12 +1,7 @@ role,name,added,ifdef_note,struct_abi_kind macro,PY_VECTORCALL_ARGUMENTS_OFFSET,3.12,, function,PyAIter_Check,3.10,, -function,PyArg_Parse,3.2,, -function,PyArg_ParseTuple,3.2,, -function,PyArg_ParseTupleAndKeywords,3.2,, function,PyArg_UnpackTuple,3.2,, -function,PyArg_VaParse,3.2,, -function,PyArg_VaParseTupleAndKeywords,3.2,, function,PyArg_ValidateKeywordArguments,3.2,, var,PyBaseObject_Type,3.2,, function,PyBool_FromLong,3.2,, @@ -490,9 +485,7 @@ function,PyObject_AsReadBuffer,3.2,, function,PyObject_AsWriteBuffer,3.2,, function,PyObject_Bytes,3.2,, function,PyObject_Call,3.2,, -function,PyObject_CallFunction,3.2,, function,PyObject_CallFunctionObjArgs,3.2,, -function,PyObject_CallMethod,3.2,, function,PyObject_CallMethodObjArgs,3.2,, function,PyObject_CallNoArgs,3.10,, function,PyObject_CallObject,3.2,, @@ -808,7 +801,6 @@ function,Py_AddPendingCall,3.2,, function,Py_AtExit,3.2,, macro,Py_BEGIN_ALLOW_THREADS,3.2,, macro,Py_BLOCK_THREADS,3.2,, -function,Py_BuildValue,3.2,, function,Py_BytesMain,3.8,, function,Py_CompileString,3.2,, function,Py_DecRef,3.2,, @@ -860,7 +852,6 @@ function,Py_SetRecursionLimit,3.2,, type,Py_UCS4,3.2,, macro,Py_UNBLOCK_THREADS,3.2,, var,Py_UTF8Mode,3.8,, -function,Py_VaBuildValue,3.2,, var,Py_Version,3.11,, function,Py_XNewRef,3.10,, type,Py_buffer,3.11,,full-abi diff --git a/Doc/extending/extending.rst b/Doc/extending/extending.rst index d9bf4fd6c7ae0e..5238f6c40aa76e 100644 --- a/Doc/extending/extending.rst +++ b/Doc/extending/extending.rst @@ -649,7 +649,7 @@ Note that any Python object references which are provided to the caller are Some example calls:: - #define PY_SSIZE_T_CLEAN /* Make "s#" use Py_ssize_t rather than int. */ + #define PY_SSIZE_T_CLEAN /* needed until Python 3.12 */ #include :: diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index bfd0995752b248..b3bdc1fef6504a 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -219,6 +219,10 @@ C API Changes New Features ------------ +* You can now use the ``#``-specifier in :ref:`format codes ` + without ``#define PY_SSIZE_T_CLEAN`` before ``#include ``. + (Contributed by Inada Naoki in :gh:`104922`.) + Porting to Python 3.13 ---------------------- diff --git a/Include/abstract.h b/Include/abstract.h index 064b0300b51ea2..73a55e1e16c397 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -135,10 +135,8 @@ extern "C" { This function always succeeds. */ -#ifdef PY_SSIZE_T_CLEAN -# define PyObject_CallFunction _PyObject_CallFunction_SizeT -# define PyObject_CallMethod _PyObject_CallMethod_SizeT -#endif +#define PyObject_CallFunction _PyObject_CallFunction_SizeT +#define PyObject_CallMethod _PyObject_CallMethod_SizeT #if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03090000 @@ -195,15 +193,6 @@ PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...); -PyAPI_FUNC(PyObject *) _PyObject_CallFunction_SizeT(PyObject *callable, - const char *format, - ...); - -PyAPI_FUNC(PyObject *) _PyObject_CallMethod_SizeT(PyObject *obj, - const char *name, - const char *format, - ...); - /* Call a callable Python object 'callable' with a variable number of C arguments. The C arguments are provided as PyObject* values, terminated by a NULL. diff --git a/Include/cpython/abstract.h b/Include/cpython/abstract.h index 3b27aab2fc4798..992dd068db90ea 100644 --- a/Include/cpython/abstract.h +++ b/Include/cpython/abstract.h @@ -4,10 +4,6 @@ /* === Object Protocol ================================================== */ -#ifdef PY_SSIZE_T_CLEAN -# define _PyObject_CallMethodId _PyObject_CallMethodId_SizeT -#endif - /* Convert keyword arguments from the FASTCALL (stack: C array, kwnames: tuple) format to a Python dictionary ("kwargs" dict). @@ -113,11 +109,6 @@ PyAPI_FUNC(PyObject *) _PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name, const char *format, ...); -PyAPI_FUNC(PyObject *) _PyObject_CallMethodId_SizeT(PyObject *obj, - _Py_Identifier *name, - const char *format, - ...); - PyAPI_FUNC(PyObject *) _PyObject_CallMethodIdObjArgs( PyObject *obj, _Py_Identifier *name, diff --git a/Include/cpython/modsupport.h b/Include/cpython/modsupport.h index 88f34fe7513bf2..2cea105ce7ac97 100644 --- a/Include/cpython/modsupport.h +++ b/Include/cpython/modsupport.h @@ -2,19 +2,19 @@ # error "this header file must not be included directly" #endif -/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier - to mean Py_ssize_t */ -#ifdef PY_SSIZE_T_CLEAN -#define _Py_VaBuildStack _Py_VaBuildStack_SizeT -#else -PyAPI_FUNC(PyObject *) _Py_VaBuildValue_SizeT(const char *, va_list); +PyAPI_FUNC(PyObject **) _Py_VaBuildStack( + PyObject **small_stack, + Py_ssize_t small_stack_len, + const char *format, + va_list va, + Py_ssize_t *p_nargs); + PyAPI_FUNC(PyObject **) _Py_VaBuildStack_SizeT( PyObject **small_stack, Py_ssize_t small_stack_len, const char *format, va_list va, Py_ssize_t *p_nargs); -#endif PyAPI_FUNC(int) _PyArg_UnpackStack( PyObject *const *args, @@ -43,13 +43,6 @@ PyAPI_FUNC(int) _PyArg_CheckPositional(const char *, Py_ssize_t, ((!_Py_ANY_VARARGS(max) && (min) <= (nargs) && (nargs) <= (max)) \ || _PyArg_CheckPositional((funcname), (nargs), (min), (max))) -PyAPI_FUNC(PyObject **) _Py_VaBuildStack( - PyObject **small_stack, - Py_ssize_t small_stack_len, - const char *format, - va_list va, - Py_ssize_t *p_nargs); - typedef struct _PyArg_Parser { int initialized; const char *format; @@ -63,13 +56,6 @@ typedef struct _PyArg_Parser { struct _PyArg_Parser *next; } _PyArg_Parser; -#ifdef PY_SSIZE_T_CLEAN -#define _PyArg_ParseTupleAndKeywordsFast _PyArg_ParseTupleAndKeywordsFast_SizeT -#define _PyArg_ParseStack _PyArg_ParseStack_SizeT -#define _PyArg_ParseStackAndKeywords _PyArg_ParseStackAndKeywords_SizeT -#define _PyArg_VaParseTupleAndKeywordsFast _PyArg_VaParseTupleAndKeywordsFast_SizeT -#endif - PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *, struct _PyArg_Parser *, ...); PyAPI_FUNC(int) _PyArg_ParseStack( diff --git a/Include/modsupport.h b/Include/modsupport.h index 4e369bd56b4d20..4c3ceca596c7ee 100644 --- a/Include/modsupport.h +++ b/Include/modsupport.h @@ -9,9 +9,9 @@ extern "C" { #include // va_list -/* If PY_SSIZE_T_CLEAN is defined, each functions treats #-specifier - to mean Py_ssize_t */ -#ifdef PY_SSIZE_T_CLEAN +/* Since Python 3.13, each functions treats #-specifier to mean Py_ssize_t + * regardless PY_SSIZE_T_CLEAN is defined, + */ #define PyArg_Parse _PyArg_Parse_SizeT #define PyArg_ParseTuple _PyArg_ParseTuple_SizeT #define PyArg_ParseTupleAndKeywords _PyArg_ParseTupleAndKeywords_SizeT @@ -19,10 +19,9 @@ extern "C" { #define PyArg_VaParseTupleAndKeywords _PyArg_VaParseTupleAndKeywords_SizeT #define Py_BuildValue _Py_BuildValue_SizeT #define Py_VaBuildValue _Py_VaBuildValue_SizeT -#endif /* Due to a glitch in 3.2, the _SizeT versions weren't exported from the DLL. */ -#if !defined(PY_SSIZE_T_CLEAN) || !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03030000 PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, @@ -34,9 +33,6 @@ PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, PyAPI_FUNC(int) PyArg_ValidateKeywordArguments(PyObject *); PyAPI_FUNC(int) PyArg_UnpackTuple(PyObject *, const char *, Py_ssize_t, Py_ssize_t, ...); PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); -PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); - - PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list); // Add an attribute with name 'name' and value 'obj' to the module 'mod. diff --git a/Misc/NEWS.d/next/C API/2023-05-25-17-30-43.gh-issue-104922.V6nibW.rst b/Misc/NEWS.d/next/C API/2023-05-25-17-30-43.gh-issue-104922.V6nibW.rst new file mode 100644 index 00000000000000..aa18824e3c5dba --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-05-25-17-30-43.gh-issue-104922.V6nibW.rst @@ -0,0 +1,2 @@ +``PY_SSIZE_T_CLEAN`` is no longer required to use '#' specifier in APIs like +:c:func:`PyArg_ParseTuple` and :c:func:`Py_BuildValue`. diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index 48299e9b35ff97..8b4688053a4cc4 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -383,16 +383,21 @@ [function.PyArg_Parse] added = '3.2' + abi_only = true [function.PyArg_ParseTuple] added = '3.2' + abi_only = true [function.PyArg_ParseTupleAndKeywords] added = '3.2' + abi_only = true [function.PyArg_UnpackTuple] added = '3.2' [function.PyArg_VaParse] added = '3.2' + abi_only = true [function.PyArg_VaParseTupleAndKeywords] added = '3.2' + abi_only = true [function.PyArg_ValidateKeywordArguments] added = '3.2' [data.PyBaseObject_Type] @@ -1132,10 +1137,12 @@ added = '3.2' [function.PyObject_CallFunction] added = '3.2' + abi_only = true [function.PyObject_CallFunctionObjArgs] added = '3.2' [function.PyObject_CallMethod] added = '3.2' + abi_only = true [function.PyObject_CallMethodObjArgs] added = '3.2' [function.PyObject_CallObject] @@ -1595,6 +1602,7 @@ added = '3.2' [function.Py_BuildValue] added = '3.2' + abi_only = true [function.Py_CompileString] added = '3.2' [function.Py_DecRef] @@ -1661,6 +1669,7 @@ added = '3.2' [function.Py_VaBuildValue] added = '3.2' + abi_only = true [function._PyErr_BadInternalCall] added = '3.2' diff --git a/Objects/call.c b/Objects/call.c index 0d548dcd5e1aed..0f6cf569121bb3 100644 --- a/Objects/call.c +++ b/Objects/call.c @@ -572,8 +572,9 @@ _PyObject_CallFunctionVa(PyThreadState *tstate, PyObject *callable, return result; } - -PyObject * +// Export for the stable ABI +#undef PyObject_CallFunction +PyAPI_FUNC(PyObject *) PyObject_CallFunction(PyObject *callable, const char *format, ...) { va_list va; @@ -634,7 +635,9 @@ callmethod(PyThreadState *tstate, PyObject* callable, const char *format, va_lis return _PyObject_CallFunctionVa(tstate, callable, format, va, is_size_t); } -PyObject * +// Export for the stable ABI +#undef PyObject_CallMethod +PyAPI_FUNC(PyObject *) PyObject_CallMethod(PyObject *obj, const char *name, const char *format, ...) { PyThreadState *tstate = _PyThreadState_GET(); @@ -724,7 +727,7 @@ _PyObject_CallMethodId(PyObject *obj, _Py_Identifier *name, va_list va; va_start(va, format); - PyObject *retval = callmethod(tstate, callable, format, va, 0); + PyObject *retval = callmethod(tstate, callable, format, va, 1); va_end(va); Py_DECREF(callable); @@ -767,30 +770,6 @@ _PyObject_CallMethod_SizeT(PyObject *obj, const char *name, } -PyObject * -_PyObject_CallMethodId_SizeT(PyObject *obj, _Py_Identifier *name, - const char *format, ...) -{ - PyThreadState *tstate = _PyThreadState_GET(); - if (obj == NULL || name == NULL) { - return null_error(tstate); - } - - PyObject *callable = _PyObject_GetAttrId(obj, name); - if (callable == NULL) { - return NULL; - } - - va_list va; - va_start(va, format); - PyObject *retval = callmethod(tstate, callable, format, va, 1); - va_end(va); - - Py_DECREF(callable); - return retval; -} - - /* --- Call with "..." arguments ---------------------------------- */ static PyObject * diff --git a/Python/getargs.c b/Python/getargs.c index 66dd90877fe6ff..214ee59d4fa285 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -12,28 +12,32 @@ #ifdef __cplusplus extern "C" { #endif -int PyArg_Parse(PyObject *, const char *, ...); -int PyArg_ParseTuple(PyObject *, const char *, ...); -int PyArg_VaParse(PyObject *, const char *, va_list); - -int PyArg_ParseTupleAndKeywords(PyObject *, PyObject *, - const char *, char **, ...); -int PyArg_VaParseTupleAndKeywords(PyObject *, PyObject *, - const char *, char **, va_list); - -int _PyArg_ParseTupleAndKeywordsFast(PyObject *, PyObject *, - struct _PyArg_Parser *, ...); -int _PyArg_VaParseTupleAndKeywordsFast(PyObject *, PyObject *, - struct _PyArg_Parser *, va_list); +// Remove alias to _SizeT version in modsupport.h +// These functions are kept for stable ABI. +#undef PyArg_Parse +#undef PyArg_ParseTuple +#undef PyArg_ParseTupleAndKeywords +#undef PyArg_VaParse +#undef PyArg_VaParseTupleAndKeywords +PyAPI_FUNC(int) PyArg_Parse(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_ParseTuple(PyObject *, const char *, ...); +PyAPI_FUNC(int) PyArg_VaParse(PyObject *, const char *, va_list); + +PyAPI_FUNC(int) PyArg_ParseTupleAndKeywords( + PyObject *, PyObject *, const char *, char **, ...); +PyAPI_FUNC(int) PyArg_VaParseTupleAndKeywords( + PyObject *, PyObject *, const char *, char **, va_list); + +PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast( + PyObject *, PyObject *, struct _PyArg_Parser *, ...); +PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast( + PyObject *, PyObject *, struct _PyArg_Parser *, va_list); #ifdef HAVE_DECLSPEC_DLL /* Export functions */ PyAPI_FUNC(int) _PyArg_Parse_SizeT(PyObject *, const char *, ...); PyAPI_FUNC(int) _PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs, const char *format, ...); -PyAPI_FUNC(int) _PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, - PyObject *kwnames, - struct _PyArg_Parser *parser, ...); PyAPI_FUNC(int) _PyArg_ParseTuple_SizeT(PyObject *, const char *, ...); PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywords_SizeT(PyObject *, PyObject *, const char *, char **, ...); @@ -41,11 +45,6 @@ PyAPI_FUNC(PyObject *) _Py_BuildValue_SizeT(const char *, ...); PyAPI_FUNC(int) _PyArg_VaParse_SizeT(PyObject *, const char *, va_list); PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *, PyObject *, const char *, char **, va_list); - -PyAPI_FUNC(int) _PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *, - struct _PyArg_Parser *, ...); -PyAPI_FUNC(int) _PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *, PyObject *, - struct _PyArg_Parser *, va_list); #endif #define FLAG_COMPAT 1 @@ -151,25 +150,12 @@ _PyArg_ParseStack(PyObject *const *args, Py_ssize_t nargs, const char *format, . int retval; va_list va; - va_start(va, format); - retval = vgetargs1_impl(NULL, args, nargs, format, &va, 0); - va_end(va); - return retval; -} - -PyAPI_FUNC(int) -_PyArg_ParseStack_SizeT(PyObject *const *args, Py_ssize_t nargs, const char *format, ...) -{ - int retval; - va_list va; - va_start(va, format); retval = vgetargs1_impl(NULL, args, nargs, format, &va, FLAG_SIZE_T); va_end(va); return retval; } - int PyArg_VaParse(PyObject *args, const char *format, va_list va) { @@ -657,7 +643,11 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, char *msgbuf, size_t bufsize, freelist_t *freelist) { #define RETURN_ERR_OCCURRED return msgbuf - /* For # codes */ + // For # codes + // Even though Python 3.13 uses ssize_t ragardless PY_SSIZE_T_CLEAN, + // extension compiled with Python ~3.9 may still use int version API. + // Remove this check after we drop supporting extension module built with + // Python ~3.9. #define REQUIRE_PY_SSIZE_T_CLEAN \ if (!(flags & FLAG_SIZE_T)) { \ PyErr_SetString(PyExc_SystemError, \ @@ -1368,7 +1358,6 @@ _PyArg_ParseTupleAndKeywords_SizeT(PyObject *args, return retval; } - int PyArg_VaParseTupleAndKeywords(PyObject *args, PyObject *keywords, @@ -1420,60 +1409,33 @@ _PyArg_VaParseTupleAndKeywords_SizeT(PyObject *args, return retval; } -PyAPI_FUNC(int) +int _PyArg_ParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, ...) { int retval; va_list va; - va_start(va, parser); - retval = vgetargskeywordsfast(args, keywords, parser, &va, 0); - va_end(va); - return retval; -} - -PyAPI_FUNC(int) -_PyArg_ParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords, - struct _PyArg_Parser *parser, ...) -{ - int retval; - va_list va; - va_start(va, parser); retval = vgetargskeywordsfast(args, keywords, parser, &va, FLAG_SIZE_T); va_end(va); return retval; } -PyAPI_FUNC(int) +int _PyArg_ParseStackAndKeywords(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames, struct _PyArg_Parser *parser, ...) { int retval; va_list va; - va_start(va, parser); - retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, 0); - va_end(va); - return retval; -} - -PyAPI_FUNC(int) -_PyArg_ParseStackAndKeywords_SizeT(PyObject *const *args, Py_ssize_t nargs, PyObject *kwnames, - struct _PyArg_Parser *parser, ...) -{ - int retval; - va_list va; - va_start(va, parser); retval = vgetargskeywordsfast_impl(args, nargs, NULL, kwnames, parser, &va, FLAG_SIZE_T); va_end(va); return retval; } - -PyAPI_FUNC(int) +int _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, struct _PyArg_Parser *parser, va_list va) { @@ -1482,20 +1444,6 @@ _PyArg_VaParseTupleAndKeywordsFast(PyObject *args, PyObject *keywords, va_copy(lva, va); - retval = vgetargskeywordsfast(args, keywords, parser, &lva, 0); - va_end(lva); - return retval; -} - -PyAPI_FUNC(int) -_PyArg_VaParseTupleAndKeywordsFast_SizeT(PyObject *args, PyObject *keywords, - struct _PyArg_Parser *parser, va_list va) -{ - int retval; - va_list lva; - - va_copy(lva, va); - retval = vgetargskeywordsfast(args, keywords, parser, &lva, FLAG_SIZE_T); va_end(lva); return retval; diff --git a/Python/modsupport.c b/Python/modsupport.c index be229c987b8a78..4f9ba7de828abc 100644 --- a/Python/modsupport.c +++ b/Python/modsupport.c @@ -5,6 +5,13 @@ #include "pycore_abstract.h" // _PyIndex_Check() #include "pycore_object.h" // _PyType_IsReady() +// Remove alias to _SizeT version in modsupport.h +// These two functions are kept for stable ABI. +#undef Py_BuildValue +#undef Py_VaBuildValue +PyAPI_FUNC(PyObject *) Py_BuildValue(const char *, ...); +PyAPI_FUNC(PyObject *) Py_VaBuildValue(const char *, va_list); + #define FLAG_SIZE_T 1 typedef double va_double; @@ -277,6 +284,10 @@ do_mktuple(const char **p_format, va_list *p_va, char endchar, Py_ssize_t n, int static PyObject * do_mkvalue(const char **p_format, va_list *p_va, int flags) { + // Even though Python 3.13 uses ssize_t ragardless PY_SSIZE_T_CLEAN, + // extension compiled with Python ~3.9 may still use int version API. + // Remove this check after we drop supporting extension module built with + // Python ~3.9. #define ERROR_NEED_PY_SSIZE_T_CLEAN \ { \ PyErr_SetString(PyExc_SystemError, \ @@ -503,7 +514,6 @@ do_mkvalue(const char **p_format, va_list *p_va, int flags) #undef ERROR_NEED_PY_SSIZE_T_CLEAN } - PyObject * Py_BuildValue(const char *format, ...) { diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 33147f012b611d..32be7ec09ebfd6 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -211,7 +211,7 @@ sys_audit_tstate(PyThreadState *ts, const char *event, /* Initialize event args now */ if (argFormat && argFormat[0]) { - eventArgs = _Py_VaBuildValue_SizeT(argFormat, vargs); + eventArgs = Py_VaBuildValue(argFormat, vargs); if (eventArgs && !PyTuple_Check(eventArgs)) { PyObject *argTuple = PyTuple_Pack(1, eventArgs); Py_SETREF(eventArgs, argTuple);