[Python-checkins] r81383 - in python/branches/release31-maint: Lib/test/test_warnings.py Misc/NEWS Python/_warnings.c Python/pythonrun.c

victor.stinner python-checkins at python.org
Thu May 20 23:00:34 CEST 2010


Author: victor.stinner
Date: Thu May 20 23:00:34 2010
New Revision: 81383

Log:
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.
........


Modified:
   python/branches/release31-maint/   (props changed)
   python/branches/release31-maint/Lib/test/test_warnings.py
   python/branches/release31-maint/Misc/NEWS
   python/branches/release31-maint/Python/_warnings.c
   python/branches/release31-maint/Python/pythonrun.c

Modified: python/branches/release31-maint/Lib/test/test_warnings.py
==============================================================================
--- python/branches/release31-maint/Lib/test/test_warnings.py	(original)
+++ python/branches/release31-maint/Lib/test/test_warnings.py	Thu May 20 23:00:34 2010
@@ -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__":

Modified: python/branches/release31-maint/Misc/NEWS
==============================================================================
--- python/branches/release31-maint/Misc/NEWS	(original)
+++ python/branches/release31-maint/Misc/NEWS	Thu May 20 23:00:34 2010
@@ -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
 

Modified: python/branches/release31-maint/Python/_warnings.c
==============================================================================
--- python/branches/release31-maint/Python/_warnings.c	(original)
+++ python/branches/release31-maint/Python/_warnings.c	Thu May 20 23:00:34 2010
@@ -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;

Modified: python/branches/release31-maint/Python/pythonrun.c
==============================================================================
--- python/branches/release31-maint/Python/pythonrun.c	(original)
+++ python/branches/release31-maint/Python/pythonrun.c	Thu May 20 23:00:34 2010
@@ -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)


More information about the Python-checkins mailing list