Recorded merge of revisions 81364 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r81364 | victor.stinner | 2010-05-19 22:40:50 +0200 (mer., 19 mai 2010) | 3 lines

  Issue #8766: Initialize _warnings module before importing the first module.
  Fix a crash if an empty directory called "encodings" exists in sys.path.
........
diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py
index c1e29b8..5cf1034 100644
--- a/Lib/test/test_warnings.py
+++ b/Lib/test/test_warnings.py
@@ -4,6 +4,9 @@
 from io import StringIO
 import sys
 import unittest
+import shutil
+import tempfile
+import subprocess
 from test import support
 
 from test import warning_tests
@@ -670,18 +673,46 @@
     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
+        old_cwd = os.getcwd()
+        try:
+            cwd = tempfile.mkdtemp()
+            try:
+                os.chdir(cwd)
+                os.mkdir('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)
+            finally:
+                shutil.rmtree(cwd)
+        finally:
+            os.chdir(old_cwd)
+
 def test_main():
     py_warnings.onceregistry.clear()
     c_warnings.onceregistry.clear()
-    support.run_unittest(CFilterTests,
-                                PyFilterTests,
-                                CWarnTests,
-                                PyWarnTests,
-                                CWCmdLineTests, PyWCmdLineTests,
-                                _WarningsTests,
-                                CWarningsDisplayTests, PyWarningsDisplayTests,
-                                CCatchWarningTests, PyCatchWarningTests,
-                             )
+    support.run_unittest(
+        CFilterTests, PyFilterTests,
+        CWarnTests, PyWarnTests,
+        CWCmdLineTests, PyWCmdLineTests,
+        _WarningsTests,
+        CWarningsDisplayTests, PyWarningsDisplayTests,
+        CCatchWarningTests, PyCatchWarningTests,
+        BootstrapTest,
+    )
 
 
 if __name__ == "__main__":
diff --git a/Misc/NEWS b/Misc/NEWS
index cf23427..66433e4 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@
 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.
+
 - PyObject_Dump() encodes unicode objects to utf8 with backslashreplace
   (instead of strict) error handler to escape surrogates
 
diff --git a/Python/_warnings.c b/Python/_warnings.c
index f0e1e51..9453844 100644
--- a/Python/_warnings.c
+++ b/Python/_warnings.c
@@ -116,7 +116,7 @@
         _filters = warnings_filters;
     }
 
-    if (!PyList_Check(_filters)) {
+    if (_filters == NULL || !PyList_Check(_filters)) {
         PyErr_SetString(PyExc_ValueError,
                         MODULE_NAME ".filters must be a list");
         return NULL;
diff --git a/Python/pythonrun.c b/Python/pythonrun.c
index ec2c6ca..252b2d1 100644
--- a/Python/pythonrun.c
+++ b/Python/pythonrun.c
@@ -264,6 +264,9 @@
 
     _PyImportHooks_Init();
 
+    /* Initialize _warnings. */
+    _PyWarnings_Init();
+
 #if defined(HAVE_LANGINFO_H) && defined(CODESET)
     /* On Unix, set the file system encoding according to the
        user's preference, if the CODESET names a well-known
@@ -284,7 +287,6 @@
         initsigs(); /* Signal handling stuff, including initintr() */
 
     /* Initialize warnings. */
-    _PyWarnings_Init();
     if (PySys_HasWarnOptions()) {
         PyObject *warnings_module = PyImport_ImportModule("warnings");
         if (!warnings_module)