annotate Tools/scripts/gprof2html.py @ 81343:3a7cd8efc19f

#16852: merge with 3.3.
author Ezio Melotti <ezio.melotti@gmail.com>
date Thu, 10 Jan 2013 03:29:45 +0200
parents 4d603d6782db
children 354e4d096c34
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59522
fcfe324663a6 convert shebang lines: python -> python3
Benjamin Peterson <benjamin@python.org>
parents: 33074
diff changeset
1 #! /usr/bin/env python32.3
24721
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 """Transform gprof(1) output into useful HTML."""
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 import re, os, sys, cgi, webbrowser
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 header = """\
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 <html>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 <head>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 <title>gprof output (%s)</title>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 </head>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 <body>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 <pre>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
14 """
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
15
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 trailer = """\
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 </pre>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 </body>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 </html>
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 """
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
21
76250
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
22 def add_escapes(filename):
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
23 with open(filename) as fp:
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
24 for line in fp:
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
25 yield cgi.escape(line)
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
26
24721
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
27
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 def main():
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 filename = "gprof.out"
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
30 if sys.argv[1:]:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 filename = sys.argv[1]
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 outputfilename = filename + ".html"
76250
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
33 input = add_escapes(filename)
4d603d6782db #14508: make gprof2html script runnable under python3
R David Murray <rdmurray@bitdance.com>
parents: 59522
diff changeset
34 output = open(outputfilename, "w")
24721
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 output.write(header % filename)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 if line.startswith(" time"):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 break
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 labels = {}
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 m = re.match(r"(.* )(\w+)\n", line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 if not m:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 break
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 stuff, fname = m.group(1, 2)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 labels[fname] = fname
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 output.write('%s<a name="flat:%s" href="#call:%s">%s</a>\n' %
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 (stuff, fname, fname, fname))
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 if line.startswith("index % time"):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 break
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 m = re.match(r"(.* )(\w+)(( &lt;cycle.*&gt;)? \[\d+\])\n", line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 if not m:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 if line.startswith("Index by function name"):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 break
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 continue
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 prefix, fname, suffix = m.group(1, 2, 3)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 if fname not in labels:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 output.write(line)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 continue
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 if line.startswith("["):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 output.write('%s<a name="call:%s" href="#flat:%s">%s</a>%s\n' %
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 (prefix, fname, fname, fname, suffix))
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 else:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 output.write('%s<a href="#call:%s">%s</a>%s\n' %
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 (prefix, fname, fname, suffix))
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 for line in input:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 for part in re.findall(r"(\w+(?:\.c)?|\W+)", line):
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 if part in labels:
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 part = '<a href="#call:%s">%s</a>' % (part, part)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 output.write(part)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 output.write(trailer)
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 output.close()
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 webbrowser.open("file:" + os.path.abspath(outputfilename))
2d3c4a7aec0a A tool to transform gprof(1) output into HTML, so you can click on a
Guido van Rossum <guido@python.org>
parents:
diff changeset
79
33074
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 24721
diff changeset
80 if __name__ == '__main__':
981fff7363b9 [Patch #1005491 ] use __name__ == '__main__' in scripts
Andrew M. Kuchling <amk@amk.ca>
parents: 24721
diff changeset
81 main()