annotate Lib/idlelib/StackViewer.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents ef4cca2d6171
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18587
30414b41fac9 py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18562
diff changeset
1 import os
30414b41fac9 py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18562
diff changeset
2 import sys
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
3 import linecache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
4
42714
2ec16b6b4d04 Switch to absolute imports to support direct execution of modules. Many
Kurt B. Kaiser <kbk@shore.net>
parents: 42324
diff changeset
5 from idlelib.TreeWidget import TreeNode, TreeItem, ScrolledCanvas
2ec16b6b4d04 Switch to absolute imports to support direct execution of modules. Many
Kurt B. Kaiser <kbk@shore.net>
parents: 42324
diff changeset
6 from idlelib.ObjectBrowser import ObjectTreeItem, make_objecttreeitem
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
7
18587
30414b41fac9 py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18562
diff changeset
8 def StackBrowser(root, flist=None, tb=None, top=None):
30414b41fac9 py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18562
diff changeset
9 if top is None:
47130
ef4cca2d6171 Tkinter, step 2: adapt imports.
Georg Brandl <georg@python.org>
parents: 42725
diff changeset
10 from tkinter import Toplevel
18587
30414b41fac9 py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18562
diff changeset
11 top = Toplevel(root)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
12 sc = ScrolledCanvas(top, bg="white", highlightthickness=0)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
13 sc.frame.pack(expand=1, fill="both")
18587
30414b41fac9 py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18562
diff changeset
14 item = StackTreeItem(flist, tb)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
15 node = TreeNode(sc.canvas, None, item)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
16 node.expand()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
17
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
18 class StackTreeItem(TreeItem):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
19
18587
30414b41fac9 py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18562
diff changeset
20 def __init__(self, flist=None, tb=None):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
21 self.flist = flist
26491
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
22 self.stack = self.get_stack(tb)
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
23 self.text = self.get_exception()
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
24
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
25 def get_stack(self, tb):
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
26 if tb is None:
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
27 tb = sys.last_traceback
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
28 stack = []
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
29 if tb and tb.tb_frame is None:
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
30 tb = tb.tb_next
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
31 while tb is not None:
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
32 stack.append((tb.tb_frame, tb.tb_lineno))
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
33 tb = tb.tb_next
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
34 return stack
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
35
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
36 def get_exception(self):
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
37 type = sys.last_type
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
38 value = sys.last_value
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
39 if hasattr(type, "__name__"):
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
40 type = type.__name__
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
41 s = str(type)
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
42 if value is not None:
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
43 s = s + ": " + str(value)
e0b596060313 Remove dead code in get_stack().
Kurt B. Kaiser <kbk@shore.net>
parents: 25316
diff changeset
44 return s
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
45
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
46 def GetText(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
47 return self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
48
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
49 def GetSubList(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
50 sublist = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
51 for info in self.stack:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
52 item = FrameTreeItem(info, self.flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
53 sublist.append(item)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
54 return sublist
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
55
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
56 class FrameTreeItem(TreeItem):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
57
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
58 def __init__(self, info, flist):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
59 self.info = info
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
60 self.flist = flist
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
61
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
62 def GetText(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
63 frame, lineno = self.info
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
64 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
65 modname = frame.f_globals["__name__"]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
66 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
67 modname = "?"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
68 code = frame.f_code
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
69 filename = code.co_filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
70 funcname = code.co_name
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
71 sourceline = linecache.getline(filename, lineno)
25316
df0ff5b17e1a Merge Py Idle changes:
Kurt B. Kaiser <kbk@shore.net>
parents: 24114
diff changeset
72 sourceline = sourceline.strip()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
73 if funcname in ("?", "", None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
74 item = "%s, line %d: %s" % (modname, lineno, sourceline)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
75 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
76 item = "%s.%s(...), line %d: %s" % (modname, funcname,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
77 lineno, sourceline)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
78 return item
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
79
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
80 def GetSubList(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
81 frame, lineno = self.info
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
82 sublist = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
83 if frame.f_globals is not frame.f_locals:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
84 item = VariablesTreeItem("<locals>", frame.f_locals, self.flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
85 sublist.append(item)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
86 item = VariablesTreeItem("<globals>", frame.f_globals, self.flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
87 sublist.append(item)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
88 return sublist
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
89
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
90 def OnDoubleClick(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
91 if self.flist:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
92 frame, lineno = self.info
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
93 filename = frame.f_code.co_filename
18587
30414b41fac9 py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18562
diff changeset
94 if os.path.isfile(filename):
30414b41fac9 py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18562
diff changeset
95 self.flist.gotofileline(filename, lineno)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
96
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
97 class VariablesTreeItem(ObjectTreeItem):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
98
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
99 def GetText(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
100 return self.labeltext
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
101
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
102 def GetLabelText(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
103 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
104
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
105 def IsExpandable(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
106 return len(self.object) > 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
107
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
108 def keys(self):
42725
fa9a40ef0780 Conform to py3k dict.{keys, items, values} with some advice from 2b3
Kurt B. Kaiser <kbk@shore.net>
parents: 42714
diff changeset
109 return list(self.object.keys())
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
110
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
111 def GetSubList(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
112 sublist = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
113 for key in self.keys():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
114 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
115 value = self.object[key]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
116 except KeyError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
117 continue
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
118 def setfunction(value, key=key, object=self.object):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
119 object[key] = value
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
120 item = make_objecttreeitem(key + " =", value, setfunction)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
121 sublist.append(item)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
122 return sublist