summaryrefslogtreecommitdiffstats
path: root/Python/_warnings.c
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2013-05-08 11:23:25 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2013-05-08 11:23:25 (GMT)
commit070cb3c9bed3fbdbda42c257e05d46adcbeb784e (patch)
tree747b3c3a8e2fd7ecdfb5123bcb425e47ba5913b2 /Python/_warnings.c
parentd62a5143867096e1eeeca82b8db229dd27e94569 (diff)
downloadcpython-070cb3c9bed3fbdbda42c257e05d46adcbeb784e.zip
cpython-070cb3c9bed3fbdbda42c257e05d46adcbeb784e.tar.gz
cpython-070cb3c9bed3fbdbda42c257e05d46adcbeb784e.tar.bz2
Issue #1545463: At shutdown, defer finalization of codec modules so that stderr remains usable.
(should fix Windows buildbot failures on test_gc)
Diffstat (limited to 'Python/_warnings.c')
-rw-r--r--Python/_warnings.c47
1 files changed, 45 insertions, 2 deletions
diff --git a/Python/_warnings.c b/Python/_warnings.c
index f33e477..03e0c45 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -800,8 +800,8 @@ PyErr_WarnExplicit(PyObject *category, const char *text,
goto exit;
if (module_str != NULL) {
module = PyUnicode_FromString(module_str);
- if (module == NULL)
- goto exit;
+ if (module == NULL)
+ goto exit;
}
if (category == NULL)
@@ -820,6 +820,49 @@ PyErr_WarnExplicit(PyObject *category, const char *text,
return ret;
}
+int
+PyErr_WarnExplicitFormat(PyObject *category,
+ const char *filename_str, int lineno,
+ const char *module_str, PyObject *registry,
+ const char *format, ...)
+{
+ PyObject *message;
+ PyObject *module = NULL;
+ PyObject *filename = PyUnicode_DecodeFSDefault(filename_str);
+ int ret = -1;
+ va_list vargs;
+
+ if (filename == NULL)
+ goto exit;
+ if (module_str != NULL) {
+ module = PyUnicode_FromString(module_str);
+ if (module == NULL)
+ goto exit;
+ }
+
+#ifdef HAVE_STDARG_PROTOTYPES
+ va_start(vargs, format);
+#else
+ va_start(vargs);
+#endif
+ message = PyUnicode_FromFormatV(format, vargs);
+ if (message != NULL) {
+ PyObject *res;
+ res = warn_explicit(category, message, filename, lineno,
+ module, registry, NULL);
+ Py_DECREF(message);
+ if (res != NULL) {
+ Py_DECREF(res);
+ ret = 0;
+ }
+ }
+ va_end(vargs);
+exit:
+ Py_XDECREF(module);
+ Py_XDECREF(filename);
+ return ret;
+}
+
PyDoc_STRVAR(warn_doc,
"Issue a warning, or maybe ignore it or raise an exception.");