]> granicus.if.org Git - python/commitdiff
Issue #18711: Add a new `PyErr_FormatV` function, similar to `PyErr_Format` but accep...
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 30 Sep 2014 19:16:27 +0000 (21:16 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 30 Sep 2014 19:16:27 +0000 (21:16 +0200)
Doc/c-api/exceptions.rst
Doc/data/refcounts.dat
Include/pyerrors.h
Misc/NEWS
PC/python3.def
PC/python35stub.def
Python/errors.c

index b0b1e43b05a23c521913eb0bf168149475122506..98bb152764d442aec83484993482003b9739d87c 100644 (file)
@@ -197,6 +197,14 @@ in various ways.  There is a separate error indicator for each thread.
    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)``.
index 6025617a1bedb411108b238d9fd43cb18503dd29..d1c24e5fcacaac25227c8f722a46535ac929fef1 100644 (file)
@@ -349,6 +349,11 @@ PyErr_Format:PyObject*:exception:+1:
 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::
index e44fb5f0ebff8a0c3bb232e3de527403c88a1643..24bc2b7a8d551c1bc36aa786a87d844938a57b65 100644 (file)
@@ -242,6 +242,12 @@ PyAPI_FUNC(PyObject *) PyErr_Format(
     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(
index 3a5e635326bb7d6165d2672edcba872467514713..12d34ef7e5b256b0905ef659009a97fc5385696b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ Release date: TBA
 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.
 
index fad6448928f3481ac9ec738faaf5c0ef5737e131..5257d5e48e33aed7e30ce05dce5bd0968c48c5be 100644 (file)
@@ -120,6 +120,7 @@ EXPORTS
   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
index 8736ffb1fa424065536c0249fc8b276953a43e8d..6501da0adb9b1010422533f6353dbde2c697fb66 100644 (file)
@@ -119,6 +119,7 @@ PyErr_Display
 PyErr_ExceptionMatches
 PyErr_Fetch
 PyErr_Format
+PyErr_FormatV
 PyErr_GivenExceptionMatches
 PyErr_NewException
 PyErr_NewExceptionWithDoc
index 996292a04479a2cf3897b94bbea453f2e9c602bc..fd551425250c4416c33fcef7740f540967801ce3 100644 (file)
@@ -749,19 +749,11 @@ PyErr_BadInternalCall(void)
 #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,11 +763,24 @@ PyErr_Format(PyObject *exception, const char *format, ...)
     string = PyUnicode_FromFormatV(format, vargs);
     PyErr_SetObject(exception, string);
     Py_XDECREF(string);
-    va_end(vargs);
     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)