Issue #8766: Initialize _warnings module before importing the first module.

Fix a crash if an empty directory called "encodings" exists in sys.path.
This commit is contained in:
Victor Stinner 2010-05-19 20:40:50 +00:00
parent 5b08b4d230
commit 7d79b8b771
4 changed files with 36 additions and 13 deletions

View file

@ -738,20 +738,38 @@ class PyEnvironmentVariableTests(EnvironmentVariableTests):
module = py_warnings module = py_warnings
class BootstrapTest(unittest.TestCase):
def test_issue_8766(self):
# "import encodings" emits a warning whereas the warnings is not loaded
# or not completly loaded (warnings imports indirectly encodings by
# importing linecache) yet
with support.temp_cwd() as cwd, support.temp_cwd('encodings'):
env = os.environ.copy()
env['PYTHONPATH'] = cwd
# encodings loaded by initfsencoding()
retcode = subprocess.call([sys.executable, '-c', 'pass'], env=env)
self.assertEqual(retcode, 0)
# Use -W to load warnings module at startup
retcode = subprocess.call(
[sys.executable, '-c', 'pass', '-W', 'always'],
env=env)
self.assertEqual(retcode, 0)
def test_main(): def test_main():
py_warnings.onceregistry.clear() py_warnings.onceregistry.clear()
c_warnings.onceregistry.clear() c_warnings.onceregistry.clear()
support.run_unittest(CFilterTests, support.run_unittest(
PyFilterTests, CFilterTests, PyFilterTests,
CWarnTests, CWarnTests, PyWarnTests,
PyWarnTests, CWCmdLineTests, PyWCmdLineTests,
CWCmdLineTests, PyWCmdLineTests, _WarningsTests,
_WarningsTests, CWarningsDisplayTests, PyWarningsDisplayTests,
CWarningsDisplayTests, PyWarningsDisplayTests, CCatchWarningTests, PyCatchWarningTests,
CCatchWarningTests, PyCatchWarningTests, CEnvironmentVariableTests, PyEnvironmentVariableTests,
CEnvironmentVariableTests, BootstrapTest,
PyEnvironmentVariableTests )
)
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #8766: Initialize _warnings module before importing the first module.
Fix a crash if an empty directory called "encodings" exists in sys.path.
- Issue #8589: Decode PYTHONWARNINGS environment variable with the file system - Issue #8589: Decode PYTHONWARNINGS environment variable with the file system
encoding and surrogateespace error handler instead of the locale encoding to encoding and surrogateespace error handler instead of the locale encoding to
be consistent with os.environ. Add PySys_AddWarnOptionUnicode() function. be consistent with os.environ. Add PySys_AddWarnOptionUnicode() function.

View file

@ -116,7 +116,7 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno,
_filters = warnings_filters; _filters = warnings_filters;
} }
if (!PyList_Check(_filters)) { if (_filters == NULL || !PyList_Check(_filters)) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
MODULE_NAME ".filters must be a list"); MODULE_NAME ".filters must be a list");
return NULL; return NULL;

View file

@ -265,13 +265,15 @@ Py_InitializeEx(int install_sigs)
_PyImportHooks_Init(); _PyImportHooks_Init();
/* Initialize _warnings. */
_PyWarnings_Init();
initfsencoding(); initfsencoding();
if (install_sigs) if (install_sigs)
initsigs(); /* Signal handling stuff, including initintr() */ initsigs(); /* Signal handling stuff, including initintr() */
/* Initialize warnings. */ /* Initialize warnings. */
_PyWarnings_Init();
if (PySys_HasWarnOptions()) { if (PySys_HasWarnOptions()) {
PyObject *warnings_module = PyImport_ImportModule("warnings"); PyObject *warnings_module = PyImport_ImportModule("warnings");
if (!warnings_module) if (!warnings_module)