Mercurial > cpython-lru_cache-weakref
annotate Lib/idlelib/StackViewer.py @ 80661:94de77bd0b4b 2.7
Issue #16194: document imp.load_dynamic problems
when read several extension modules from the same binary object file.
| author | Andrew Svetlov <andrew.svetlov@gmail.com> |
|---|---|
| date | Thu, 29 Nov 2012 19:51:28 +0200 |
| parents | eab361617f6a |
| children |
| 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 | 3 import linecache |
| 4 | |
|
60144
eab361617f6a
#7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
47183
diff
changeset
|
5 from idlelib.TreeWidget import TreeNode, TreeItem, ScrolledCanvas |
|
eab361617f6a
#7092: Fix additional "-3" warnings in the idlelib package, and convert to absolute imports.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
47183
diff
changeset
|
6 from idlelib.ObjectBrowser import ObjectTreeItem, make_objecttreeitem |
| 13975 | 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: |
|
47183
b53604fad54b
Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents:
47101
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 | 12 sc = ScrolledCanvas(top, bg="white", highlightthickness=0) |
| 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 | 15 node = TreeNode(sc.canvas, None, item) |
| 16 node.expand() | |
| 17 | |
| 18 class StackTreeItem(TreeItem): | |
| 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 | 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 | 45 |
| 46 def GetText(self): | |
| 47 return self.text | |
| 48 | |
| 49 def GetSubList(self): | |
| 50 sublist = [] | |
| 51 for info in self.stack: | |
| 52 item = FrameTreeItem(info, self.flist) | |
| 53 sublist.append(item) | |
| 54 return sublist | |
| 55 | |
| 56 class FrameTreeItem(TreeItem): | |
| 57 | |
| 58 def __init__(self, info, flist): | |
| 59 self.info = info | |
| 60 self.flist = flist | |
| 61 | |
| 62 def GetText(self): | |
| 63 frame, lineno = self.info | |
| 64 try: | |
| 65 modname = frame.f_globals["__name__"] | |
| 66 except: | |
| 67 modname = "?" | |
| 68 code = frame.f_code | |
| 69 filename = code.co_filename | |
| 70 funcname = code.co_name | |
| 71 sourceline = linecache.getline(filename, lineno) | |
| 25316 | 72 sourceline = sourceline.strip() |
| 13975 | 73 if funcname in ("?", "", None): |
| 74 item = "%s, line %d: %s" % (modname, lineno, sourceline) | |
| 75 else: | |
| 76 item = "%s.%s(...), line %d: %s" % (modname, funcname, | |
| 77 lineno, sourceline) | |
| 78 return item | |
| 79 | |
| 80 def GetSubList(self): | |
| 81 frame, lineno = self.info | |
| 82 sublist = [] | |
| 83 if frame.f_globals is not frame.f_locals: | |
| 84 item = VariablesTreeItem("<locals>", frame.f_locals, self.flist) | |
| 85 sublist.append(item) | |
| 86 item = VariablesTreeItem("<globals>", frame.f_globals, self.flist) | |
| 87 sublist.append(item) | |
| 88 return sublist | |
| 89 | |
| 90 def OnDoubleClick(self): | |
| 91 if self.flist: | |
| 92 frame, lineno = self.info | |
| 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 | 96 |
| 97 class VariablesTreeItem(ObjectTreeItem): | |
| 98 | |
| 99 def GetText(self): | |
| 100 return self.labeltext | |
| 101 | |
| 102 def GetLabelText(self): | |
| 103 return None | |
| 104 | |
| 105 def IsExpandable(self): | |
| 106 return len(self.object) > 0 | |
| 107 | |
| 108 def keys(self): | |
| 109 return self.object.keys() | |
| 110 | |
| 111 def GetSubList(self): | |
| 112 sublist = [] | |
| 113 for key in self.keys(): | |
| 114 try: | |
| 115 value = self.object[key] | |
| 116 except KeyError: | |
| 117 continue | |
| 118 def setfunction(value, key=key, object=self.object): | |
| 119 object[key] = value | |
| 120 item = make_objecttreeitem(key + " =", value, setfunction) | |
| 121 sublist.append(item) | |
| 122 return sublist | |
|
18562
f40140588b1e
py-cvs-rel2_1 (Rev 1.15) merge - whitespace normalization
Kurt B. Kaiser <kbk@shore.net>
parents:
13975
diff
changeset
|
123 |
| 13975 | 124 |
|
18587
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
125 def _test(): |
|
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
126 try: |
|
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
127 import testcode |
|
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
128 reload(testcode) |
|
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
129 except: |
|
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
130 sys.last_type, sys.last_value, sys.last_traceback = sys.exc_info() |
|
47183
b53604fad54b
Tkinter rename reversal: remove tkinter package, adapt imports and docs.
Georg Brandl <georg@python.org>
parents:
47101
diff
changeset
|
131 from Tkinter import Tk |
| 13975 | 132 root = Tk() |
|
18587
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
133 StackBrowser(None, top=root) |
|
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
134 root.mainloop() |
|
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
135 |
|
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
136 if __name__ == "__main__": |
|
30414b41fac9
py-cvs-2001_07_13 (Rev 1.16) merge
Kurt B. Kaiser <kbk@shore.net>
parents:
18562
diff
changeset
|
137 _test() |
