Skip to content

Commit 3ee921d

Browse files
authored
gh-102832: IDLE - remove use of deprecated sys.last_xyzs for stackviewer (#103339)
1 parent 68dfa49 commit 3ee921d

File tree

4 files changed

+22
-52
lines changed

4 files changed

+22
-52
lines changed

Lib/idlelib/idle_test/test_stackviewer.py

Lines changed: 4 additions & 10 deletions
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

Lines changed: 6 additions & 6 deletions
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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -622,17 +622,16 @@ def get_the_completion_list(self, what, mode):
622622

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

638637

Lib/idlelib/stackviewer.py

Lines changed: 9 additions & 32 deletions
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy