*** cgitb.py.org Sun Nov 07 12:57:04 2004
--- cgitb.py Sun Nov 07 13:58:00 2004
***************
*** 37,42 ****
--- 37,44 ----
'''
__UNDEF__ = [] # a special sentinel object
+ __GETATTR_FAILED__ = '<ungettable attribute>'
+ __HTML_REPR_FAILED__ = '<unreprable value>'
def small(text):
if text:
return '' + text + ''
***************
*** 71,76 ****
--- 73,97 ----
return 'builtin', getattr(builtins, name)
return None, __UNDEF__
+ class _safe_call:
+ def __init__(self,func,failval):
+ self.func = func
+ self.failval = failval
+ def __call__(self,*args):
+ if len(args)==1 and (args[0] is __HTML_REPR_FAILED__ or args[0] is __GETATTR_FAILED__): return args[0]
+ try:
+ return self.func(*args)
+ except:
+ return self.failval
+
+ def _pydoc_repr(value,sub='html'):
+ import pydoc
+ return getattr(pydoc,'html').repr(value)
+
+ _safe_getattr = _safe_call(getattr,__GETATTR_FAILED__)
+ _safe_html_repr = _safe_call(_pydoc_repr,__HTML_REPR_FAILED__)
+ _safe_text_repr = _safe_call(lambda x: _pydoc_repr(x,'text'),'unprintable value')
+
def scanvars(reader, frame, locals):
"""Scan one logical line of Python and look up values of variables used."""
import tokenize, keyword
***************
*** 80,86 ****
if ttype == tokenize.NAME and token not in keyword.kwlist:
if lasttoken == '.':
if parent is not __UNDEF__:
! value = getattr(parent, token, __UNDEF__)
vars.append((prefix + token, prefix, value))
else:
where, value = lookup(token, frame, locals)
--- 101,107 ----
if ttype == tokenize.NAME and token not in keyword.kwlist:
if lasttoken == '.':
if parent is not __UNDEF__:
! value = _safe_getattr(parent, token,__UNDEF__)
vars.append((prefix + token, prefix, value))
else:
where, value = lookup(token, frame, locals)
***************
*** 119,125 ****
if func != '?':
call = 'in ' + strong(func) + \
inspect.formatargvalues(args, varargs, varkw, locals,
! formatvalue=lambda value: '=' + pydoc.html.repr(value))
highlight = {}
def reader(lnum=[lnum]):
--- 140,146 ----
if func != '?':
call = 'in ' + strong(func) + \
inspect.formatargvalues(args, varargs, varkw, locals,
! formatvalue=lambda value: '=' + _safe_html_repr(value))
highlight = {}
def reader(lnum=[lnum]):
***************
*** 152,158 ****
name = strong(name)
else:
name = where + strong(name.split('.')[-1])
! dump.append('%s = %s' % (name, pydoc.html.repr(value)))
else:
dump.append(name + ' undefined')
--- 173,179 ----
name = strong(name)
else:
name = where + strong(name.split('.')[-1])
! dump.append('%s = %s' % (name, _safe_html_repr(value)))
else:
dump.append(name + ' undefined')
***************
*** 166,172 ****
if type(evalue) is types.InstanceType:
for name in dir(evalue):
if name[:1] == '_': continue
! value = pydoc.html.repr(getattr(evalue, name))
exception.append('\n
%s%s =\n%s' % (indent, name, value))
import traceback
--- 187,193 ----
if type(evalue) is types.InstanceType:
for name in dir(evalue):
if name[:1] == '_': continue
! value = _safe_html_repr(_safe_getattr(evalue, name))
exception.append('\n
%s%s =\n%s' % (indent, name, value))
import traceback
***************
*** 203,209 ****
if func != '?':
call = 'in ' + func + \
inspect.formatargvalues(args, varargs, varkw, locals,
! formatvalue=lambda value: '=' + pydoc.text.repr(value))
highlight = {}
def reader(lnum=[lnum]):
--- 224,230 ----
if func != '?':
call = 'in ' + func + \
inspect.formatargvalues(args, varargs, varkw, locals,
! formatvalue=lambda value: '=' + _safe_text_repr(value))
highlight = {}
def reader(lnum=[lnum]):
***************
*** 227,233 ****
if value is not __UNDEF__:
if where == 'global': name = 'global ' + name
elif where != 'local': name = where + name.split('.')[-1]
! dump.append('%s = %s' % (name, pydoc.text.repr(value)))
else:
dump.append(name + ' undefined')
--- 248,254 ----
if value is not __UNDEF__:
if where == 'global': name = 'global ' + name
elif where != 'local': name = where + name.split('.')[-1]
! dump.append('%s = %s' % (name, _safe_text_repr(value)))
else:
dump.append(name + ' undefined')
***************
*** 237,243 ****
exception = ['%s: %s' % (str(etype), str(evalue))]
if type(evalue) is types.InstanceType:
for name in dir(evalue):
! value = pydoc.text.repr(getattr(evalue, name))
exception.append('\n%s%s = %s' % (" "*4, name, value))
import traceback
--- 258,264 ----
exception = ['%s: %s' % (str(etype), str(evalue))]
if type(evalue) is types.InstanceType:
for name in dir(evalue):
! value = _safe_text_repr(_safe_getattr(evalue, name))
exception.append('\n%s%s = %s' % (" "*4, name, value))
import traceback