summaryrefslogtreecommitdiffstats
path: root/Mac/Tools/IDE/ProfileBrowser.py
blob: c7a81ccebf9cee5b051224c3f48ed8823d548799 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import W
from Carbon import Evt
import EasyDialogs

import sys
import StringIO
import string
import pstats, fpformat

# increase precision
def f8(x):
	return string.rjust(fpformat.fix(x, 4), 8)
pstats.f8 = f8

# hacking around a hack
if sys.version[:3] > '1.4':
	timer = Evt.TickCount
else:
	def timer(TickCount = Evt.TickCount):
		return TickCount() / 60.0

class ProfileBrowser:
	
	def __init__(self, stats = None):
		self.sortkeys = ('calls',)
		self.setupwidgets()
		self.setstats(stats)
	
	def setupwidgets(self): 
		self.w = W.Window((580, 400), "Profile Statistics", minsize = (200, 100), tabbable = 0)
		self.w.divline = W.HorizontalLine((0, 20, 0, 0))
		self.w.titlebar = W.TextBox((4, 4, 40, 12), 'Sort by:')
		self.buttons = []
		x = 54
		width1 = 50
		width2 = 75
		for name in ["calls", "time", "cumulative", "stdname", "file", "line", "name"]:
			if len(name) > 6:
				width = width2
			else:
				width = width1
			self.w["button_" + name] = W.RadioButton((x, 4, width, 12), name, self.buttons, self.setsort)
			x += width + 10
		self.w.button_calls.set(1)
		self.w.text = W.TextEditor((0, 21, -15, -15), inset = (6, 5), 
				readonly = 1, wrap = 0, fontsettings = ('Monaco', 0, 9, (0, 0, 0)))
		self.w._bary = W.Scrollbar((-15, 20, 16, -14), self.w.text.vscroll, max = 32767)
		self.w._barx = W.Scrollbar((-1, -15, -14, 16), self.w.text.hscroll, max = 32767)
		self.w.open()
	
	def setstats(self, stats):
		self.stats = stats
		self.stats.strip_dirs()
		self.displaystats()
	
	def setsort(self):
		# Grmpf. The callback doesn't give us the button:-(
		for b in self.buttons:
			if b.get():
				if b._title == self.sortkeys[0]:
					return
				self.sortkeys = (b._title,) + self.sortkeys[:3]
				break
		self.displaystats()
	
	def displaystats(self):
		W.SetCursor('watch')
		apply(self.stats.sort_stats, self.sortkeys)
		saveout = sys.stdout
		try:
			s = sys.stdout = StringIO.StringIO()
			self.stats.print_stats()
		finally:
			sys.stdout = saveout
		text = string.join(string.split(s.getvalue(), '\n'), '\r')
		self.w.text.set(text)


def main():
	import pstats
	args = sys.argv[1:]
	for i in args:
		stats = pstats.Stats(i)
		browser = ProfileBrowser(stats)
	else:
		import macfs
		filename = EasyDialogs.AskFileForOpen(message='Profiler data')
		if not filename: sys.exit(0)
		stats = pstats.Stats(filename)
		browser = ProfileBrowser(stats)

if __name__ == '__main__':
	main()