]> granicus.if.org Git - python/commitdiff
1. RPC stack levels were not pruned from traceback unless IDLE was started
authorKurt B. Kaiser <kbk@shore.net>
Tue, 24 Dec 2002 00:57:22 +0000 (00:57 +0000)
committerKurt B. Kaiser <kbk@shore.net>
Tue, 24 Dec 2002 00:57:22 +0000 (00:57 +0000)
   from its source directory.
2. Replace final traceback '?' with '-toplevel-'
3. Remove duplicated import boolcheck

Lib/idlelib/PyShell.py

index ffdde4ee852bd6e0b34892113d14c6478b61a7e4..d89802c5e60b0a1ff01e98443af05d276d489daf 100644 (file)
@@ -12,8 +12,6 @@ import traceback
 import types
 import exceptions
 
-import boolcheck
-
 import linecache
 from code import InteractiveInterpreter
 
@@ -217,7 +215,7 @@ class PyShellEditorWindow(EditorWindow):
                 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 @@ class ModifiedInterpreter(InteractiveInterpreter):
             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 @@ class ModifiedInterpreter(InteractiveInterpreter):
                 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