*** 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