"""Python part of the warnings subsystem."""
+# Note: function level imports should *not* be used
+# in this module as it may cause import lock deadlock.
+# See bug 683658.
import sys, re, types
+import linecache
__all__ = ["warn", "showwarning", "formatwarning", "filterwarnings",
"resetwarnings"]
def formatwarning(message, category, filename, lineno):
"""Function to format a warning the standard way."""
- import linecache
s = "%s:%s: %s: %s\n" % (filename, lineno, category.__name__, message)
line = linecache.getline(filename, lineno).strip()
if line:
Py_XDECREF(tb);
}
+extern PyObject *PyModule_WarningsModule;
/* Function to issue a warning message; may raise an exception. */
int
PyErr_Warn(PyObject *category, char *message)
{
- PyObject *mod, *dict, *func = NULL;
+ PyObject *dict, *func = NULL;
- mod = PyImport_ImportModule("warnings");
- if (mod != NULL) {
- dict = PyModule_GetDict(mod);
+ if (PyModule_WarningsModule != NULL) {
+ dict = PyModule_GetDict(PyModule_WarningsModule);
func = PyDict_GetItemString(dict, "warn");
- Py_DECREF(mod);
}
if (func == NULL) {
PySys_WriteStderr("warning: %s\n", message);
true divisions (which they will be in 2.3). */
int _Py_QnewFlag = 0;
+/* Reference to 'warnings' module, to avoid importing it
+ on the fly when the import lock may be held. See 683658
+*/
+PyObject *PyModule_WarningsModule = NULL;
+
static int initialized = 0;
/* API to access the initialized flag -- useful for esoteric use */
_PyImportHooks_Init();
+ PyModule_WarningsModule = PyImport_ImportModule("warnings");
+
initsigs(); /* Signal handling stuff, including initintr() */
initmain(); /* Module __main__ */
/* Cleanup Codec registry */
_PyCodecRegistry_Fini();
+ /* drop module references we saved */
+ Py_XDECREF(PyModule_WarningsModule);
+ PyModule_WarningsModule = NULL;
+
/* Destroy all modules */
PyImport_Cleanup();