diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2013-05-08 11:23:25 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2013-05-08 11:23:25 (GMT) |
commit | 070cb3c9bed3fbdbda42c257e05d46adcbeb784e (patch) | |
tree | 747b3c3a8e2fd7ecdfb5123bcb425e47ba5913b2 /Python/_warnings.c | |
parent | d62a5143867096e1eeeca82b8db229dd27e94569 (diff) | |
download | cpython-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.c | 47 |
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."); |