*** cgitb-orig.py 2014-05-19 18:37:42.000000000 +0100
--- cgitb.py 2014-07-19 13:57:32.290464305 +0100
***************
*** 43,48 ****
--- 43,50 ----
'''
__UNDEF__ = [] # a special sentinel object
+ __GETATTR_FAILED__ = '<ungettable attribute>'
+ __HTML_REPR_FAILED__ = '<unreprable value>'
def small(text):
if text:
return '' + text + ''
***************
*** 74,82 ****
return 'builtin', builtins[name]
else:
if hasattr(builtins, name):
! return 'builtin', getattr(builtins, name)
return None, __UNDEF__
def scanvars(reader, frame, locals):
"""Scan one logical line of Python and look up values of variables used."""
vars, lasttoken, parent, prefix, value = [], None, None, '', __UNDEF__
--- 76,105 ----
return 'builtin', builtins[name]
else:
if hasattr(builtins, name):
! return 'builtin', _safe_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'):
+ 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."""
vars, lasttoken, parent, prefix, value = [], None, None, '', __UNDEF__
***************
*** 85,91 ****
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)
--- 108,114 ----
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)
***************
*** 126,132 ****
if func != '?':
call = 'in ' + strong(func) + \
inspect.formatargvalues(args, varargs, varkw, locals,
! formatvalue=lambda value: '=' + pydoc.html.repr(value))
highlight = {}
def reader(lnum=[lnum]):
--- 149,155 ----
if func != '?':
call = 'in ' + strong(func) + \
inspect.formatargvalues(args, varargs, varkw, locals,
! formatvalue=lambda value: '=' + _safe_html_repr(value))
highlight = {}
def reader(lnum=[lnum]):
***************
*** 160,166 ****
name = strong(name)
else:
name = where + strong(name.split('.')[-1])
! dump.append('%s = %s' % (name, pydoc.html.repr(value)))
else:
dump.append(name + ' undefined')
--- 183,189 ----
name = strong(name)
else:
name = where + strong(name.split('.')[-1])
! dump.append('%s = %s' % (name, _safe_html_repr(value)))
else:
dump.append(name + ' undefined')
***************
*** 173,179 ****
pydoc.html.escape(str(evalue)))]
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))
return head + ''.join(frames) + ''.join(exception) + '''
--- 196,202 ----
pydoc.html.escape(str(evalue)))]
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))
return head + ''.join(frames) + ''.join(exception) + '''
***************
*** 209,215 ****
if func != '?':
call = 'in ' + func + \
inspect.formatargvalues(args, varargs, varkw, locals,
! formatvalue=lambda value: '=' + pydoc.text.repr(value))
highlight = {}
def reader(lnum=[lnum]):
--- 232,238 ----
if func != '?':
call = 'in ' + func + \
inspect.formatargvalues(args, varargs, varkw, locals,
! formatvalue=lambda value: '=' + _safe_text_repr(value))
highlight = {}
def reader(lnum=[lnum]):
***************
*** 233,239 ****
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')
--- 256,262 ----
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')
***************
*** 242,248 ****
exception = ['%s: %s' % (str(etype), str(evalue))]
for name in dir(evalue):
! value = pydoc.text.repr(getattr(evalue, name))
exception.append('\n%s%s = %s' % (" "*4, name, value))
return head + ''.join(frames) + ''.join(exception) + '''
--- 265,271 ----
exception = ['%s: %s' % (str(etype), str(evalue))]
for name in dir(evalue):
! value = _safe_text_repr(_safe_getattr(evalue, name))
exception.append('\n%s%s = %s' % (" "*4, name, value))
return head + ''.join(frames) + ''.join(exception) + '''