Issue #18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format` but accepting a `va_list` argument.

This commit is contained in:
Antoine Pitrou 2014-09-30 21:16:27 +02:00
parent 63860e5407
commit 0676a406bf
7 changed files with 39 additions and 10 deletions

View File

@ -197,6 +197,14 @@ in various ways. There is a separate error indicator for each thread.
string. 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) .. c:function:: void PyErr_SetNone(PyObject *type)
This is a shorthand for ``PyErr_SetObject(type, Py_None)``. This is a shorthand for ``PyErr_SetObject(type, Py_None)``.

View File

@ -349,6 +349,11 @@ PyErr_Format:PyObject*:exception:+1:
PyErr_Format:const char*:format:: PyErr_Format:const char*:format::
PyErr_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:int:::
PyErr_WarnEx:PyObject*:category:0: PyErr_WarnEx:PyObject*:category:0:
PyErr_WarnEx:const char*:message:: PyErr_WarnEx:const char*:message::

View File

@ -242,6 +242,12 @@ PyAPI_FUNC(PyObject *) PyErr_Format(
const char *format, /* ASCII-encoded string */ 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 #ifdef MS_WINDOWS
PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename( PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename(

View File

@ -10,6 +10,9 @@ Release date: TBA
Core and Builtins 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 - Issue #22520: Fix overflow checking when generating the repr of a unicode
object. object.

View File

@ -120,6 +120,7 @@ EXPORTS
PyErr_ExceptionMatches=python35.PyErr_ExceptionMatches PyErr_ExceptionMatches=python35.PyErr_ExceptionMatches
PyErr_Fetch=python35.PyErr_Fetch PyErr_Fetch=python35.PyErr_Fetch
PyErr_Format=python35.PyErr_Format PyErr_Format=python35.PyErr_Format
PyErr_FormatV=python35.PyErr_FormatV
PyErr_GivenExceptionMatches=python35.PyErr_GivenExceptionMatches PyErr_GivenExceptionMatches=python35.PyErr_GivenExceptionMatches
PyErr_NewException=python35.PyErr_NewException PyErr_NewException=python35.PyErr_NewException
PyErr_NewExceptionWithDoc=python35.PyErr_NewExceptionWithDoc PyErr_NewExceptionWithDoc=python35.PyErr_NewExceptionWithDoc

View File

@ -119,6 +119,7 @@ PyErr_Display
PyErr_ExceptionMatches PyErr_ExceptionMatches
PyErr_Fetch PyErr_Fetch
PyErr_Format PyErr_Format
PyErr_FormatV
PyErr_GivenExceptionMatches PyErr_GivenExceptionMatches
PyErr_NewException PyErr_NewException
PyErr_NewExceptionWithDoc PyErr_NewExceptionWithDoc

View File

@ -749,19 +749,11 @@ PyErr_BadInternalCall(void)
#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__) #define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
PyObject * PyObject *
PyErr_Format(PyObject *exception, const char *format, ...) PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
{ {
va_list vargs;
PyObject* string; PyObject* string;
#ifdef HAVE_STDARG_PROTOTYPES
va_start(vargs, format);
#else
va_start(vargs);
#endif
#ifdef Py_DEBUG #ifdef Py_DEBUG
/* in debug mode, PyEval_EvalFrameEx() fails with an assertion error /* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
if an exception is set when it is called */ if an exception is set when it is called */
@ -771,11 +763,24 @@ PyErr_Format(PyObject *exception, const char *format, ...)
string = PyUnicode_FromFormatV(format, vargs); string = PyUnicode_FromFormatV(format, vargs);
PyErr_SetObject(exception, string); PyErr_SetObject(exception, string);
Py_XDECREF(string); Py_XDECREF(string);
va_end(vargs);
return NULL; 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 * PyObject *
PyErr_NewException(const char *name, PyObject *base, PyObject *dict) PyErr_NewException(const char *name, PyObject *base, PyObject *dict)