Commit 7d79b8b7 authored by Victor Stinner's avatar Victor Stinner

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

Fix a crash if an empty directory called "encodings" exists in sys.path.
parent 5b08b4d2
...@@ -738,19 +738,37 @@ class PyEnvironmentVariableTests(EnvironmentVariableTests): ...@@ -738,19 +738,37 @@ 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, CEnvironmentVariableTests, PyEnvironmentVariableTests,
PyEnvironmentVariableTests BootstrapTest,
) )
......
...@@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1? ...@@ -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.
......
...@@ -116,7 +116,7 @@ get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno, ...@@ -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;
......
...@@ -265,13 +265,15 @@ Py_InitializeEx(int install_sigs) ...@@ -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)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment