changeset: 92678:5629481cd26d parent: 92676:8e9df3414185 user: Antoine Pitrou date: Tue Sep 30 21:16:27 2014 +0200 files: Doc/c-api/exceptions.rst Doc/data/refcounts.dat Include/pyerrors.h Misc/NEWS PC/python3.def PC/python35stub.def Python/errors.c description: Issue #18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format` but accepting a `va_list` argument. diff -r 8e9df3414185 -r 5629481cd26d Doc/c-api/exceptions.rst --- a/Doc/c-api/exceptions.rst Tue Sep 30 18:11:00 2014 +0200 +++ b/Doc/c-api/exceptions.rst Tue Sep 30 21:16:27 2014 +0200 @@ -197,6 +197,14 @@ string. +.. c:function:: PyObject* PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) + + Same as :c:func:`PyErr_Format`, but taking a `va_list` argument rather + than a variable number of arguments. + + .. versionadded:: 3.5 + + .. c:function:: void PyErr_SetNone(PyObject *type) This is a shorthand for ``PyErr_SetObject(type, Py_None)``. diff -r 8e9df3414185 -r 5629481cd26d Doc/data/refcounts.dat --- a/Doc/data/refcounts.dat Tue Sep 30 18:11:00 2014 +0200 +++ b/Doc/data/refcounts.dat Tue Sep 30 21:16:27 2014 +0200 @@ -349,6 +349,11 @@ PyErr_Format:const char*:format:: PyErr_Format::...:: +PyErr_FormatV:PyObject*::null: +PyErr_FormatV:PyObject*:exception:+1: +PyErr_FormatV:const char*:format:: +PyErr_FormatV:va_list:vargs:: + PyErr_WarnEx:int::: PyErr_WarnEx:PyObject*:category:0: PyErr_WarnEx:const char*:message:: diff -r 8e9df3414185 -r 5629481cd26d Include/pyerrors.h --- a/Include/pyerrors.h Tue Sep 30 18:11:00 2014 +0200 +++ b/Include/pyerrors.h Tue Sep 30 21:16:27 2014 +0200 @@ -242,6 +242,12 @@ const char *format, /* ASCII-encoded string */ ... ); +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 +PyAPI_FUNC(PyObject *) PyErr_FormatV( + PyObject *exception, + const char *format, + va_list vargs); +#endif #ifdef MS_WINDOWS PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename( diff -r 8e9df3414185 -r 5629481cd26d Misc/NEWS --- a/Misc/NEWS Tue Sep 30 18:11:00 2014 +0200 +++ b/Misc/NEWS Tue Sep 30 21:16:27 2014 +0200 @@ -10,6 +10,9 @@ Core and Builtins ----------------- +- Issue #18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format` + but accepting a `va_list` argument. + - Issue #22520: Fix overflow checking when generating the repr of a unicode object. diff -r 8e9df3414185 -r 5629481cd26d PC/python3.def --- a/PC/python3.def Tue Sep 30 18:11:00 2014 +0200 +++ b/PC/python3.def Tue Sep 30 21:16:27 2014 +0200 @@ -120,6 +120,7 @@ PyErr_ExceptionMatches=python35.PyErr_ExceptionMatches PyErr_Fetch=python35.PyErr_Fetch PyErr_Format=python35.PyErr_Format + PyErr_FormatV=python35.PyErr_FormatV PyErr_GivenExceptionMatches=python35.PyErr_GivenExceptionMatches PyErr_NewException=python35.PyErr_NewException PyErr_NewExceptionWithDoc=python35.PyErr_NewExceptionWithDoc diff -r 8e9df3414185 -r 5629481cd26d PC/python35stub.def --- a/PC/python35stub.def Tue Sep 30 18:11:00 2014 +0200 +++ b/PC/python35stub.def Tue Sep 30 21:16:27 2014 +0200 @@ -119,6 +119,7 @@ PyErr_ExceptionMatches PyErr_Fetch PyErr_Format +PyErr_FormatV PyErr_GivenExceptionMatches PyErr_NewException PyErr_NewExceptionWithDoc diff -r 8e9df3414185 -r 5629481cd26d Python/errors.c --- a/Python/errors.c Tue Sep 30 18:11:00 2014 +0200 +++ b/Python/errors.c Tue Sep 30 21:16:27 2014 +0200 @@ -749,19 +749,11 @@ #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) - PyObject * -PyErr_Format(PyObject *exception, const char *format, ...) +PyErr_FormatV(PyObject *exception, const char *format, va_list vargs) { - va_list vargs; PyObject* string; -#ifdef HAVE_STDARG_PROTOTYPES - va_start(vargs, format); -#else - va_start(vargs); -#endif - #ifdef Py_DEBUG /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error if an exception is set when it is called */ @@ -771,12 +763,25 @@ string = PyUnicode_FromFormatV(format, vargs); PyErr_SetObject(exception, string); Py_XDECREF(string); + return NULL; +} + + +PyObject * +PyErr_Format(PyObject *exception, const char *format, ...) +{ + va_list vargs; +#ifdef HAVE_STDARG_PROTOTYPES + va_start(vargs, format); +#else + va_start(vargs); +#endif + PyErr_FormatV(exception, format, vargs); va_end(vargs); return NULL; } - PyObject * PyErr_NewException(const char *name, PyObject *base, PyObject *dict) {