summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <bcannon@gmail.com>2009-04-01 16:06:01 (GMT)
committerBrett Cannon <bcannon@gmail.com>2009-04-01 16:06:01 (GMT)
commitf47e84ce63cc635be75ca56a28aa3dc81cc3c813 (patch)
tree2cdd66b31294b590cf9feeec4b7698a50628e035
parentc7485064278efb9231df982866ec2c0051814c74 (diff)
downloadcpython-f47e84ce63cc635be75ca56a28aa3dc81cc3c813.zip
cpython-f47e84ce63cc635be75ca56a28aa3dc81cc3c813.tar.gz
cpython-f47e84ce63cc635be75ca56a28aa3dc81cc3c813.tar.bz2
Merged revisions 70956 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r70956 | brett.cannon | 2009-04-01 09:00:34 -0700 (Wed, 01 Apr 2009) | 5 lines The cgitb module had imports in its functions. This can cause deadlock with the import lock if called from within a thread that was triggered by an import. Partially fixes issue #1665206. ........
-rw-r--r--Lib/cgitb.py25
-rw-r--r--Misc/NEWS4
2 files changed, 15 insertions, 14 deletions
diff --git a/Lib/cgitb.py b/Lib/cgitb.py
index b005511..ad56df2 100644
--- a/Lib/cgitb.py
+++ b/Lib/cgitb.py
@@ -19,13 +19,19 @@ Alternatively, if you have caught an exception and want cgitb to display it
for you, call cgitb.handler(). The optional argument to handler() is a
3-item tuple (etype, evalue, etb) just like the value of sys.exc_info().
The default handler displays output as HTML.
-"""
-
-__author__ = 'Ka-Ping Yee'
-
-__version__ = '$Revision$'
+"""
+import inspect
+import keyword
+import linecache
+import os
+import pydoc
import sys
+import tempfile
+import time
+import tokenize
+import traceback
+import types
def reset():
"""Return a string that resets the CGI and browser to a known state."""
@@ -74,7 +80,6 @@ def lookup(name, frame, locals):
def scanvars(reader, frame, locals):
"""Scan one logical line of Python and look up values of variables used."""
- import tokenize, keyword
vars, lasttoken, parent, prefix, value = [], None, None, '', __UNDEF__
for ttype, token, start, end, line in tokenize.generate_tokens(reader):
if ttype == tokenize.NEWLINE: break
@@ -96,8 +101,6 @@ def scanvars(reader, frame, locals):
def html(einfo, context=5):
"""Return a nice HTML document describing a given traceback."""
- import os, time, traceback, linecache, inspect, pydoc
-
etype, evalue, etb = einfo
if isinstance(etype, type):
etype = etype.__name__
@@ -173,7 +176,6 @@ function calls leading up to the error, in the order they occurred.</p>'''
value = pydoc.html.repr(getattr(evalue, name))
exception.append('\n<br>%s%s&nbsp;=\n%s' % (indent, name, value))
- import traceback
return head + ''.join(frames) + ''.join(exception) + '''
@@ -188,8 +190,6 @@ function calls leading up to the error, in the order they occurred.</p>'''
def text(einfo, context=5):
"""Return a plain text document describing a given traceback."""
- import os, time, traceback, linecache, inspect, pydoc
-
etype, evalue, etb = einfo
if isinstance(etype, type):
etype = etype.__name__
@@ -245,7 +245,6 @@ function calls leading up to the error, in the order they occurred.
value = pydoc.text.repr(getattr(evalue, name))
exception.append('\n%s%s = %s' % (" "*4, name, value))
- import traceback
return head + ''.join(frames) + ''.join(exception) + '''
The above is a description of an error in a Python program. Here is
@@ -278,7 +277,6 @@ class Hook:
try:
doc = formatter(info, self.context)
except: # just in case something goes wrong
- import traceback
doc = ''.join(traceback.format_exception(*info))
plain = True
@@ -292,7 +290,6 @@ class Hook:
self.file.write('<p>A problem occurred in a Python script.\n')
if self.logdir is not None:
- import os, tempfile
suffix = ['.txt', '.html'][self.format=="html"]
(fd, path) = tempfile.mkstemp(suffix=suffix, dir=self.logdir)
try:
diff --git a/Misc/NEWS b/Misc/NEWS
index 4a90ba5..524a79c 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -286,6 +286,10 @@ Core and Builtins
Library
-------
+- Issue #1665206 (partially): Move imports in cgitb to the top of the module
+ instead of performing them in functions. Helps prevent import deadlocking in
+ threads.
+
- Issue #2522: locale.format now checks its first argument to ensure it has
been passed only one pattern, avoiding mysterious errors where it appeared
that it was failing to do localization.