*** cgitb.py.org Sun Jul 25 10:57:46 2004 --- cgitb.py Fri Oct 15 00:27:26 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,101 ---- return 'builtin', getattr(builtins, name) return None, __UNDEF__ + def _safe_getattr(*args): + """protected version of getattr""" + try: + return getattr(*args) + except: + return __GETATTR_FAILED__ + + def _safe_html_repr(value): + if value is __HTML_REPR_FAILED__ or value is __GETATTR_FAILED__: return value + try: + import pydoc + return pydoc.html.repr(value) + except: + return __HTML_REPR_FAILED__ + + def _safe_text_repr(value): + if value is __GETATTR_FAILED__: return '' + try: + import pydoc + return pydoc.text.repr(value) + except: + return '' + 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) --- 105,111 ---- 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]): --- 144,150 ---- 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') --- 177,183 ---- 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 --- 191,197 ---- 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]): --- 228,234 ---- 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') --- 252,258 ---- 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 --- 262,268 ---- 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