*** 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) + '''