mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 776c0df42b
			
		
	
	
		776c0df42b
		
	
	
	
	
		
			
			Not that I haven't tested it to make sure it works, just that it can run against an empty source file. Initial patch by Popa.Claudiu.
		
			
				
	
	
		
			81 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
| #! /usr/bin/env python32.3
 | |
| 
 | |
| """Transform gprof(1) output into useful HTML."""
 | |
| 
 | |
| import re, os, sys, cgi, webbrowser
 | |
| 
 | |
| header = """\
 | |
| <html>
 | |
| <head>
 | |
|   <title>gprof output (%s)</title>
 | |
| </head>
 | |
| <body>
 | |
| <pre>
 | |
| """
 | |
| 
 | |
| trailer = """\
 | |
| </pre>
 | |
| </body>
 | |
| </html>
 | |
| """
 | |
| 
 | |
| def add_escapes(filename):
 | |
|     with open(filename) as fp:
 | |
|         for line in fp:
 | |
|             yield cgi.escape(line)
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     filename = "gprof.out"
 | |
|     if sys.argv[1:]:
 | |
|         filename = sys.argv[1]
 | |
|     outputfilename = filename + ".html"
 | |
|     input = add_escapes(filename)
 | |
|     output = open(outputfilename, "w")
 | |
|     output.write(header % filename)
 | |
|     for line in input:
 | |
|         output.write(line)
 | |
|         if line.startswith(" time"):
 | |
|             break
 | |
|     labels = {}
 | |
|     for line in input:
 | |
|         m = re.match(r"(.*  )(\w+)\n", line)
 | |
|         if not m:
 | |
|             output.write(line)
 | |
|             break
 | |
|         stuff, fname = m.group(1, 2)
 | |
|         labels[fname] = fname
 | |
|         output.write('%s<a name="flat:%s" href="#call:%s">%s</a>\n' %
 | |
|                      (stuff, fname, fname, fname))
 | |
|     for line in input:
 | |
|         output.write(line)
 | |
|         if line.startswith("index % time"):
 | |
|             break
 | |
|     for line in input:
 | |
|         m = re.match(r"(.*  )(\w+)(( <cycle.*>)? \[\d+\])\n", line)
 | |
|         if not m:
 | |
|             output.write(line)
 | |
|             if line.startswith("Index by function name"):
 | |
|                 break
 | |
|             continue
 | |
|         prefix, fname, suffix = m.group(1, 2, 3)
 | |
|         if fname not in labels:
 | |
|             output.write(line)
 | |
|             continue
 | |
|         if line.startswith("["):
 | |
|             output.write('%s<a name="call:%s" href="#flat:%s">%s</a>%s\n' %
 | |
|                          (prefix, fname, fname, fname, suffix))
 | |
|         else:
 | |
|             output.write('%s<a href="#call:%s">%s</a>%s\n' %
 | |
|                          (prefix, fname, fname, suffix))
 | |
|     for line in input:
 | |
|         for part in re.findall(r"(\w+(?:\.c)?|\W+)", line):
 | |
|             if part in labels:
 | |
|                 part = '<a href="#call:%s">%s</a>' % (part, part)
 | |
|             output.write(part)
 | |
|     output.write(trailer)
 | |
|     output.close()
 | |
|     webbrowser.open("file:" + os.path.abspath(outputfilename))
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     main()
 |