Kaydet (Commit) 148051a0 authored tarafından Victor Stinner's avatar Victor Stinner

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.
........
üst 784c027d
...@@ -4,6 +4,9 @@ import os ...@@ -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): ...@@ -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__":
......
...@@ -12,6 +12,9 @@ What's New in Python 3.1.3? ...@@ -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
......
...@@ -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;
......
...@@ -264,6 +264,9 @@ Py_InitializeEx(int install_sigs) ...@@ -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) ...@@ -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)
......
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