Skip to content

Commit c2df09f

Browse files
[3.11] gh-102832: IDLE - remove use of deprecated sys.last_xyzs for stackviewer (GH-103339) (#105527)
gh-102832: IDLE - remove use of deprecated sys.last_xyzs for stackviewer (GH-103339) (cherry picked from commit 3ee921d) Co-authored-by: Irit Katriel <[email protected]>
1 parent b073b30 commit c2df09f

File tree

4 files changed

+22
-52
lines changed

4 files changed

+22
-52
lines changed

Lib/idlelib/idle_test/test_stackviewer.py

+4-10
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,19 @@
66
from tkinter import Tk
77

88
from idlelib.tree import TreeNode, ScrolledCanvas
9-
import sys
109

1110

1211
class StackBrowserTest(unittest.TestCase):
1312

1413
@classmethod
1514
def setUpClass(cls):
16-
svs = stackviewer.sys
17-
try:
18-
abc
19-
except NameError:
20-
svs.last_type, svs.last_value, svs.last_traceback = (
21-
sys.exc_info())
2215

2316
requires('gui')
2417
cls.root = Tk()
2518
cls.root.withdraw()
2619

2720
@classmethod
2821
def tearDownClass(cls):
29-
svs = stackviewer.sys
30-
del svs.last_traceback, svs.last_type, svs.last_value
3122

3223
cls.root.update_idletasks()
3324
## for id in cls.root.tk.call('after', 'info'):
@@ -36,7 +27,10 @@ def tearDownClass(cls):
3627
del cls.root
3728

3829
def test_init(self):
39-
sb = stackviewer.StackBrowser(self.root)
30+
try:
31+
abc
32+
except NameError as exc:
33+
sb = stackviewer.StackBrowser(self.root, exc)
4034
isi = self.assertIsInstance
4135
isi(stackviewer.sc, ScrolledCanvas)
4236
isi(stackviewer.item, stackviewer.StackTreeItem)

Lib/idlelib/pyshell.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -1363,19 +1363,19 @@ def runit(self):
13631363
self.text.tag_remove(self.user_input_insert_tags, index_before)
13641364
self.shell_sidebar.update_sidebar()
13651365

1366-
def open_stack_viewer(self, event=None):
1366+
def open_stack_viewer(self, event=None): # -n mode only
13671367
if self.interp.rpcclt:
13681368
return self.interp.remote_stack_viewer()
1369+
1370+
from idlelib.stackviewer import StackBrowser
13691371
try:
1370-
sys.last_traceback
1372+
StackBrowser(self.root, sys.last_value, self.flist)
13711373
except:
13721374
messagebox.showerror("No stack trace",
13731375
"There is no stack trace yet.\n"
1374-
"(sys.last_traceback is not defined)",
1376+
"(sys.last_value is not defined)",
13751377
parent=self.text)
1376-
return
1377-
from idlelib.stackviewer import StackBrowser
1378-
StackBrowser(self.root, self.flist)
1378+
return None
13791379

13801380
def view_restart_mark(self, event=None):
13811381
self.text.see("iomark")

Lib/idlelib/run.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -621,17 +621,16 @@ def get_the_completion_list(self, what, mode):
621621

622622
def stackviewer(self, flist_oid=None):
623623
if self.user_exc_info:
624-
typ, val, tb = self.user_exc_info
624+
_, exc, tb = self.user_exc_info
625625
else:
626626
return None
627627
flist = None
628628
if flist_oid is not None:
629629
flist = self.rpchandler.get_remote_proxy(flist_oid)
630630
while tb and tb.tb_frame.f_globals["__name__"] in ["rpc", "run"]:
631631
tb = tb.tb_next
632-
sys.last_type = typ
633-
sys.last_value = val
634-
item = stackviewer.StackTreeItem(flist, tb)
632+
exc.__traceback__ = tb
633+
item = stackviewer.StackTreeItem(exc, flist)
635634
return debugobj_r.remote_object_tree_item(item)
636635

637636

Lib/idlelib/stackviewer.py

+9-32
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,30 @@
11
import linecache
22
import os
3-
import sys
43

54
import tkinter as tk
65

76
from idlelib.debugobj import ObjectTreeItem, make_objecttreeitem
87
from idlelib.tree import TreeNode, TreeItem, ScrolledCanvas
98

10-
def StackBrowser(root, flist=None, tb=None, top=None):
9+
def StackBrowser(root, exc, flist=None, top=None):
1110
global sc, item, node # For testing.
1211
if top is None:
1312
top = tk.Toplevel(root)
1413
sc = ScrolledCanvas(top, bg="white", highlightthickness=0)
1514
sc.frame.pack(expand=1, fill="both")
16-
item = StackTreeItem(flist, tb)
15+
item = StackTreeItem(exc, flist)
1716
node = TreeNode(sc.canvas, None, item)
1817
node.expand()
1918

2019

2120
class StackTreeItem(TreeItem):
2221

23-
def __init__(self, flist=None, tb=None):
22+
def __init__(self, exc, flist=None):
2423
self.flist = flist
25-
self.stack = self.get_stack(tb)
26-
self.text = self.get_exception()
24+
self.stack = self.get_stack(None if exc is None else exc.__traceback__)
25+
self.text = f"{type(exc).__name__}: {str(exc)}"
2726

2827
def get_stack(self, tb):
29-
if tb is None:
30-
tb = sys.last_traceback
3128
stack = []
3229
if tb and tb.tb_frame is None:
3330
tb = tb.tb_next
@@ -36,17 +33,7 @@ def get_stack(self, tb):
3633
tb = tb.tb_next
3734
return stack
3835

39-
def get_exception(self):
40-
type = sys.last_type
41-
value = sys.last_value
42-
if hasattr(type, "__name__"):
43-
type = type.__name__
44-
s = str(type)
45-
if value is not None:
46-
s = s + ": " + str(value)
47-
return s
48-
49-
def GetText(self):
36+
def GetText(self): # Titlecase names are overrides.
5037
return self.text
5138

5239
def GetSubList(self):
@@ -133,19 +120,9 @@ def _stack_viewer(parent): # htest #
133120
flist = PyShellFileList(top)
134121
try: # to obtain a traceback object
135122
intentional_name_error
136-
except NameError:
137-
exc_type, exc_value, exc_tb = sys.exc_info()
138-
# inject stack trace to sys
139-
sys.last_type = exc_type
140-
sys.last_value = exc_value
141-
sys.last_traceback = exc_tb
142-
143-
StackBrowser(top, flist=flist, top=top, tb=exc_tb)
144-
145-
# restore sys to original state
146-
del sys.last_type
147-
del sys.last_value
148-
del sys.last_traceback
123+
except NameError as e:
124+
StackBrowser(top, e, flist=flist, top=top)
125+
149126

150127
if __name__ == '__main__':
151128
from unittest import main

0 commit comments

Comments
 (0)