Skip to content

Commit 0676a40

Browse files
committed
Issue python#18711: Add a new PyErr_FormatV function, similar to PyErr_Format but accepting a va_list argument.
1 parent 63860e5 commit 0676a40

File tree

7 files changed

+39
-10
lines changed

7 files changed

+39
-10
lines changed

Doc/c-api/exceptions.rst

+8
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,14 @@ in various ways. There is a separate error indicator for each thread.
197197
string.
198198
199199
200+
.. c:function:: PyObject* PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
201+
202+
Same as :c:func:`PyErr_Format`, but taking a `va_list` argument rather
203+
than a variable number of arguments.
204+
205+
.. versionadded:: 3.5
206+
207+
200208
.. c:function:: void PyErr_SetNone(PyObject *type)
201209
202210
This is a shorthand for ``PyErr_SetObject(type, Py_None)``.

Doc/data/refcounts.dat

+5
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,11 @@ PyErr_Format:PyObject*:exception:+1:
349349
PyErr_Format:const char*:format::
350350
PyErr_Format::...::
351351

352+
PyErr_FormatV:PyObject*::null:
353+
PyErr_FormatV:PyObject*:exception:+1:
354+
PyErr_FormatV:const char*:format::
355+
PyErr_FormatV:va_list:vargs::
356+
352357
PyErr_WarnEx:int:::
353358
PyErr_WarnEx:PyObject*:category:0:
354359
PyErr_WarnEx:const char*:message::

Include/pyerrors.h

+6
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,12 @@ PyAPI_FUNC(PyObject *) PyErr_Format(
242242
const char *format, /* ASCII-encoded string */
243243
...
244244
);
245+
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000
246+
PyAPI_FUNC(PyObject *) PyErr_FormatV(
247+
PyObject *exception,
248+
const char *format,
249+
va_list vargs);
250+
#endif
245251

246252
#ifdef MS_WINDOWS
247253
PyAPI_FUNC(PyObject *) PyErr_SetFromWindowsErrWithFilename(

Misc/NEWS

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ Release date: TBA
1010
Core and Builtins
1111
-----------------
1212

13+
- Issue #18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format`
14+
but accepting a `va_list` argument.
15+
1316
- Issue #22520: Fix overflow checking when generating the repr of a unicode
1417
object.
1518

PC/python3.def

+1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ EXPORTS
120120
PyErr_ExceptionMatches=python35.PyErr_ExceptionMatches
121121
PyErr_Fetch=python35.PyErr_Fetch
122122
PyErr_Format=python35.PyErr_Format
123+
PyErr_FormatV=python35.PyErr_FormatV
123124
PyErr_GivenExceptionMatches=python35.PyErr_GivenExceptionMatches
124125
PyErr_NewException=python35.PyErr_NewException
125126
PyErr_NewExceptionWithDoc=python35.PyErr_NewExceptionWithDoc

PC/python35stub.def

+1
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ PyErr_Display
119119
PyErr_ExceptionMatches
120120
PyErr_Fetch
121121
PyErr_Format
122+
PyErr_FormatV
122123
PyErr_GivenExceptionMatches
123124
PyErr_NewException
124125
PyErr_NewExceptionWithDoc

Python/errors.c

+15-10
Original file line numberDiff line numberDiff line change
@@ -749,19 +749,11 @@ PyErr_BadInternalCall(void)
749749
#define PyErr_BadInternalCall() _PyErr_BadInternalCall(__FILE__, __LINE__)
750750

751751

752-
753752
PyObject *
754-
PyErr_Format(PyObject *exception, const char *format, ...)
753+
PyErr_FormatV(PyObject *exception, const char *format, va_list vargs)
755754
{
756-
va_list vargs;
757755
PyObject* string;
758756

759-
#ifdef HAVE_STDARG_PROTOTYPES
760-
va_start(vargs, format);
761-
#else
762-
va_start(vargs);
763-
#endif
764-
765757
#ifdef Py_DEBUG
766758
/* in debug mode, PyEval_EvalFrameEx() fails with an assertion error
767759
if an exception is set when it is called */
@@ -771,11 +763,24 @@ PyErr_Format(PyObject *exception, const char *format, ...)
771763
string = PyUnicode_FromFormatV(format, vargs);
772764
PyErr_SetObject(exception, string);
773765
Py_XDECREF(string);
774-
va_end(vargs);
775766
return NULL;
776767
}
777768

778769

770+
PyObject *
771+
PyErr_Format(PyObject *exception, const char *format, ...)
772+
{
773+
va_list vargs;
774+
#ifdef HAVE_STDARG_PROTOTYPES
775+
va_start(vargs, format);
776+
#else
777+
va_start(vargs);
778+
#endif
779+
PyErr_FormatV(exception, format, vargs);
780+
va_end(vargs);
781+
return NULL;
782+
}
783+
779784

780785
PyObject *
781786
PyErr_NewException(const char *name, PyObject *base, PyObject *dict)

0 commit comments

Comments
 (0)