blob: b3e9d990fec791a3606067b4ee63927251ce7e6d [file] [log] [blame]
Just van Rossum40f9b7b1999-01-30 22:39:17 +00001import W
Jack Jansen5a6fdcd2001-08-25 12:15:04 +00002from Carbon import Evt
Just van Rossum40f9b7b1999-01-30 22:39:17 +00003
4import sys
5import StringIO
6import string
7import pstats, fpformat
8
9# increase precision
10def f8(x):
11 return string.rjust(fpformat.fix(x, 4), 8)
12pstats.f8 = f8
13
14# hacking around a hack
15if sys.version[:3] > '1.4':
16 timer = Evt.TickCount
17else:
18 def timer(TickCount = Evt.TickCount):
19 return TickCount() / 60.0
20
21class ProfileBrowser:
22
23 def __init__(self, stats = None):
24 self.sortkeys = ('calls',)
25 self.setupwidgets()
26 self.setstats(stats)
27
28 def setupwidgets(self):
29 self.w = W.Window((580, 400), "Profile Statistics", minsize = (200, 100), tabbable = 0)
30 self.w.divline = W.HorizontalLine((0, 20, 0, 0))
31 self.w.titlebar = W.TextBox((4, 4, 40, 12), 'Sort by:')
32 self.buttons = []
Just van Rossum20a03d12001-12-31 08:58:44 +000033 x = 54
34 width1 = 50
35 width2 = 75
36 for name in ["calls", "time", "cumulative", "stdname", "file", "line", "name"]:
37 if len(name) > 6:
38 width = width2
39 else:
40 width = width1
41 self.w["button_" + name] = W.RadioButton((x, 4, width, 12), name, self.buttons, self.setsort)
42 x += width + 10
Just van Rossum40f9b7b1999-01-30 22:39:17 +000043 self.w.button_calls.set(1)
Just van Rossum40f9b7b1999-01-30 22:39:17 +000044 self.w.text = W.TextEditor((0, 21, -15, -15), inset = (6, 5),
45 readonly = 1, wrap = 0, fontsettings = ('Monaco', 0, 9, (0, 0, 0)))
46 self.w._bary = W.Scrollbar((-15, 20, 16, -14), self.w.text.vscroll, max = 32767)
47 self.w._barx = W.Scrollbar((-1, -15, -14, 16), self.w.text.hscroll, max = 32767)
48 self.w.open()
49
50 def setstats(self, stats):
51 self.stats = stats
52 self.stats.strip_dirs()
53 self.displaystats()
54
55 def setsort(self):
56 # Grmpf. The callback doesn't give us the button:-(
57 for b in self.buttons:
58 if b.get():
59 if b._title == self.sortkeys[0]:
60 return
61 self.sortkeys = (b._title,) + self.sortkeys[:3]
62 break
63 self.displaystats()
64
65 def displaystats(self):
66 W.SetCursor('watch')
67 apply(self.stats.sort_stats, self.sortkeys)
68 saveout = sys.stdout
69 try:
70 s = sys.stdout = StringIO.StringIO()
71 self.stats.print_stats()
72 finally:
73 sys.stdout = saveout
74 text = string.join(string.split(s.getvalue(), '\n'), '\r')
75 self.w.text.set(text)
76
77
78def main():
79 import pstats
80 args = sys.argv[1:]
81 for i in args:
82 stats = pstats.Stats(i)
83 browser = ProfileBrowser(stats)
84 else:
85 import macfs
86 fss, ok = macfs.PromptGetFile('Profiler data')
87 if not ok: sys.exit(0)
88 stats = pstats.Stats(fss.as_pathname())
89 browser = ProfileBrowser(stats)
90
91if __name__ == '__main__':
92 main()