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.
........
This commit is contained in:
Victor Stinner 2010-05-20 21:00:34 +00:00
parent 784c027d18
commit 148051a054
4 changed files with 47 additions and 11 deletions

View File

@ -4,6 +4,9 @@ import os
from io import StringIO from io import StringIO
import sys import sys
import unittest import unittest
import shutil
import tempfile
import subprocess
from test import support from test import support
from test import warning_tests from test import warning_tests
@ -670,18 +673,46 @@ class PyCatchWarningTests(CatchWarningTests):
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
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(): 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, BootstrapTest,
) )
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -12,6 +12,9 @@ What's New in Python 3.1.3?
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.
- PyObject_Dump() encodes unicode objects to utf8 with backslashreplace - PyObject_Dump() encodes unicode objects to utf8 with backslashreplace
(instead of strict) error handler to escape surrogates (instead of strict) error handler to escape surrogates

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

@ -264,6 +264,9 @@ Py_InitializeEx(int install_sigs)
_PyImportHooks_Init(); _PyImportHooks_Init();
/* Initialize _warnings. */
_PyWarnings_Init();
#if defined(HAVE_LANGINFO_H) && defined(CODESET) #if defined(HAVE_LANGINFO_H) && defined(CODESET)
/* On Unix, set the file system encoding according to the /* On Unix, set the file system encoding according to the
user's preference, if the CODESET names a well-known user's preference, if the CODESET names a well-known
@ -284,7 +287,6 @@ Py_InitializeEx(int 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)