summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorIrit Katriel <1055913+iritkatriel@users.noreply.github.com>2023-06-08 20:19:05 (GMT)
committerGitHub <noreply@github.com>2023-06-08 20:19:05 (GMT)
commit3ee921d84f06da9dfa8aa29e0d33778b9dbf8f23 (patch)
tree94677a4b77f8aeafa5b9bf20873df41e288a60a3 /Lib
parent68dfa496278aa21585eb4654d5f7ef13ef76cb50 (diff)
downloadcpython-3ee921d84f06da9dfa8aa29e0d33778b9dbf8f23.zip
cpython-3ee921d84f06da9dfa8aa29e0d33778b9dbf8f23.tar.gz
cpython-3ee921d84f06da9dfa8aa29e0d33778b9dbf8f23.tar.bz2
gh-102832: IDLE - remove use of deprecated sys.last_xyzs for stackviewer (#103339)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/idlelib/idle_test/test_stackviewer.py14
-rwxr-xr-xLib/idlelib/pyshell.py12
-rw-r--r--Lib/idlelib/run.py7
-rw-r--r--Lib/idlelib/stackviewer.py41
4 files changed, 22 insertions, 52 deletions
diff --git a/Lib/idlelib/idle_test/test_stackviewer.py b/Lib/idlelib/idle_test/test_stackviewer.py
index 98f53f9..55f5103 100644
--- a/Lib/idlelib/idle_test/test_stackviewer.py
+++ b/Lib/idlelib/idle_test/test_stackviewer.py
@@ -6,19 +6,12 @@ from test.support import requires
from tkinter import Tk
from idlelib.tree import TreeNode, ScrolledCanvas
-import sys
class StackBrowserTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
- svs = stackviewer.sys
- try:
- abc
- except NameError:
- svs.last_type, svs.last_value, svs.last_traceback = (
- sys.exc_info())
requires('gui')
cls.root = Tk()
@@ -26,8 +19,6 @@ class StackBrowserTest(unittest.TestCase):
@classmethod
def tearDownClass(cls):
- svs = stackviewer.sys
- del svs.last_traceback, svs.last_type, svs.last_value
cls.root.update_idletasks()
## for id in cls.root.tk.call('after', 'info'):
@@ -36,7 +27,10 @@ class StackBrowserTest(unittest.TestCase):
del cls.root
def test_init(self):
- sb = stackviewer.StackBrowser(self.root)
+ try:
+ abc
+ except NameError as exc:
+ sb = stackviewer.StackBrowser(self.root, exc)
isi = self.assertIsInstance
isi(stackviewer.sc, ScrolledCanvas)
isi(stackviewer.item, stackviewer.StackTreeItem)
diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py
index bdde156..3141b47 100755
--- a/Lib/idlelib/pyshell.py
+++ b/Lib/idlelib/pyshell.py
@@ -1363,19 +1363,19 @@ class PyShell(OutputWindow):
self.text.tag_remove(self.user_input_insert_tags, index_before)
self.shell_sidebar.update_sidebar()
- def open_stack_viewer(self, event=None):
+ def open_stack_viewer(self, event=None): # -n mode only
if self.interp.rpcclt:
return self.interp.remote_stack_viewer()
+
+ from idlelib.stackviewer import StackBrowser
try:
- sys.last_traceback
+ StackBrowser(self.root, sys.last_value, self.flist)
except:
messagebox.showerror("No stack trace",
"There is no stack trace yet.\n"
- "(sys.last_traceback is not defined)",
+ "(sys.last_value is not defined)",
parent=self.text)
- return
- from idlelib.stackviewer import StackBrowser
- StackBrowser(self.root, self.flist)
+ return None
def view_restart_mark(self, event=None):
self.text.see("iomark")
diff --git a/Lib/idlelib/run.py b/Lib/idlelib/run.py
index 84792a8..4ffc90a 100644
--- a/Lib/idlelib/run.py
+++ b/Lib/idlelib/run.py
@@ -622,7 +622,7 @@ class Executive:
def stackviewer(self, flist_oid=None):
if self.user_exc_info:
- typ, val, tb = self.user_exc_info
+ _, exc, tb = self.user_exc_info
else:
return None
flist = None
@@ -630,9 +630,8 @@ class Executive:
flist = self.rpchandler.get_remote_proxy(flist_oid)
while tb and tb.tb_frame.f_globals["__name__"] in ["rpc", "run"]:
tb = tb.tb_next
- sys.last_type = typ
- sys.last_value = val
- item = stackviewer.StackTreeItem(flist, tb)
+ exc.__traceback__ = tb
+ item = stackviewer.StackTreeItem(exc, flist)
return debugobj_r.remote_object_tree_item(item)
diff --git a/Lib/idlelib/stackviewer.py b/Lib/idlelib/stackviewer.py
index 94ffb4e..7b00c4c 100644
--- a/Lib/idlelib/stackviewer.py
+++ b/Lib/idlelib/stackviewer.py
@@ -1,33 +1,30 @@
import linecache
import os
-import sys
import tkinter as tk
from idlelib.debugobj import ObjectTreeItem, make_objecttreeitem
from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas
-def StackBrowser(root, flist=None, tb=None, top=None):
+def StackBrowser(root, exc, flist=None, top=None):
global sc, item, node # For testing.
if top is None:
top = tk.Toplevel(root)
sc = ScrolledCanvas(top, bg="white", highlightthickness=0)
sc.frame.pack(expand=1, fill="both")
- item = StackTreeItem(flist, tb)
+ item = StackTreeItem(exc, flist)
node = TreeNode(sc.canvas, None, item)
node.expand()
class StackTreeItem(TreeItem):
- def __init__(self, flist=None, tb=None):
+ def __init__(self, exc, flist=None):
self.flist = flist
- self.stack = self.get_stack(tb)
- self.text = self.get_exception()
+ self.stack = self.get_stack(None if exc is None else exc.__traceback__)
+ self.text = f"{type(exc).__name__}: {str(exc)}"
def get_stack(self, tb):
- if tb is None:
- tb = sys.last_traceback
stack = []
if tb and tb.tb_frame is None:
tb = tb.tb_next
@@ -36,17 +33,7 @@ class StackTreeItem(TreeItem):
tb = tb.tb_next
return stack
- def get_exception(self):
- type = sys.last_type
- value = sys.last_value
- if hasattr(type, "__name__"):
- type = type.__name__
- s = str(type)
- if value is not None:
- s = s + ": " + str(value)
- return s
-
- def GetText(self):
+ def GetText(self): # Titlecase names are overrides.
return self.text
def GetSubList(self):
@@ -133,19 +120,9 @@ def _stack_viewer(parent): # htest #
flist = PyShellFileList(top)
try: # to obtain a traceback object
intentional_name_error
- except NameError:
- exc_type, exc_value, exc_tb = sys.exc_info()
- # inject stack trace to sys
- sys.last_type = exc_type
- sys.last_value = exc_value
- sys.last_traceback = exc_tb
-
- StackBrowser(top, flist=flist, top=top, tb=exc_tb)
-
- # restore sys to original state
- del sys.last_type
- del sys.last_value
- del sys.last_traceback
+ except NameError as e:
+ StackBrowser(top, e, flist=flist, top=top)
+
if __name__ == '__main__':
from unittest import main