diff Lib/idlelib/PyShell.py @ 26771:fc7fdec3fb86 legacy-trunk

1. RPC stack levels were not pruned from traceback unless IDLE was started from its source directory. 2. Replace final traceback '?' with '-toplevel-' 3. Remove duplicated import boolcheck
author Kurt B. Kaiser <kbk@shore.net>
date Tue, 24 Dec 2002 00:57:22 +0000
parents c1272f3f28f5
children 240fdbef8c60
line wrap: on
line diff
--- a/Lib/idlelib/PyShell.py	Tue Dec 24 00:51:05 2002 +0000
+++ b/Lib/idlelib/PyShell.py	Tue Dec 24 00:57:22 2002 +0000
@@ -12,8 +12,6 @@
 import types
 import exceptions
 
-import boolcheck
-
 import linecache
 from code import InteractiveInterpreter
 
@@ -217,7 +215,7 @@
                 lineno += 1
         return lines
 
-# XXX 13 Dec 2020 KBK Not used currently
+# XXX 13 Dec 2002 KBK Not used currently
 #    def saved_change_hook(self):
 #        "Extend base method - clear breaks if module is modified"
 #        if not self.get_saved():
@@ -395,15 +393,8 @@
             elif how == "EXCEPTION":
                 mod, name, args, tb = what
                 print >>file, 'Traceback (most recent call last):'
-                while tb and tb[0][0] in ("run.py", "rpc.py"):
-                    del tb[0]
-                while tb and tb[-1][0] in ("run.py", "rpc.py"):
-                    del tb[-1]
-                for i in range(len(tb)):
-                    fn, ln, nm, line = tb[i]
-                    if not line and fn.startswith("<pyshell#"):
-                        line = linecache.getline(fn, ln)
-                        tb[i] = fn, ln, nm, line
+                exclude = ("run.py", "rpc.py")
+                self.cleanup_traceback(tb, exclude)
                 traceback.print_list(tb, file=file)
                 # try to reinstantiate the exception, stuff in the args:
                 try:
@@ -425,6 +416,30 @@
                 print >>file, errmsg, what
             self.tkconsole.endexecuting()
 
+    def cleanup_traceback(self, tb, exclude):
+        "Remove excluded traces from beginning/end of tb; get cached lines"
+        while tb:
+            for rpcfile in exclude:
+                if tb[0][0].count(rpcfile):
+                    break    # found an exclude, break for: and delete tb[0]
+            else:
+                break        # no excludes, have left RPC code, break while:
+            del tb[0]
+        while tb:
+            for rpcfile in exclude:
+                if tb[-1][0].count(rpcfile):
+                    break       
+            else:
+                break
+            del tb[-1]
+        for i in range(len(tb)):
+            fn, ln, nm, line = tb[i]
+            if nm == '?':
+                nm = "-toplevel-"
+            if not line and fn.startswith("<pyshell#"):
+                line = linecache.getline(fn, ln)
+            tb[i] = fn, ln, nm, line
+
     def kill_subprocess(self):
         clt = self.rpcclt
         self.rpcclt = None