[Python-checkins] cpython: Issue #18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format` but

antoine.pitrou python-checkins at python.org
Tue Sep 30 21:17:11 CEST 2014


https://hg.python.org/cpython/rev/5629481cd26d
changeset:   92678:5629481cd26d
parent:      92676:8e9df3414185
user:        Antoine Pitrou <solipsis at pitrou.net>
date:        Tue Sep 30 21:16:27 2014 +0200
summary:
  Issue #18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format` but accepting a `va_list` argument.

files:
  Doc/c-api/exceptions.rst |   8 ++++++++
  Doc/data/refcounts.dat   |   5 +++++
  Include/pyerrors.h       |   6 ++++++
  Misc/NEWS                |   3 +++
  PC/python3.def           |   1 +
  PC/python35stub.def      |   1 +
  Python/errors.c          |  25 +++++++++++++++----------
  7 files changed, 39 insertions(+), 10 deletions(-)


diff --git a/Doc/c-api/exceptions.rst b/Doc/c-api/exceptions.rst
--- a/Doc/c-api/exceptions.rst
+++ b/Doc/c-api/exceptions.rst
@@ -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 --git a/Doc/data/refcounts.dat b/Doc/data/refcounts.dat
--- a/Doc/data/refcounts.dat
+++ b/Doc/data/refcounts.dat
@@ -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 --git a/Include/pyerrors.h b/Include/pyerrors.h
--- a/Include/pyerrors.h
+++ b/Include/pyerrors.h
@@ -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 --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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 --git a/PC/python3.def b/PC/python3.def
--- a/PC/python3.def
+++ b/PC/python3.def
@@ -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 --git a/PC/python35stub.def b/PC/python35stub.def
--- a/PC/python35stub.def
+++ b/PC/python35stub.def
@@ -119,6 +119,7 @@
 PyErr_ExceptionMatches
 PyErr_Fetch
 PyErr_Format
+PyErr_FormatV
 PyErr_GivenExceptionMatches
 PyErr_NewException
 PyErr_NewExceptionWithDoc
diff --git a/Python/errors.c b/Python/errors.c
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -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)
 {

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list