| 
									
										
										
										
											2000-10-09 14:35:24 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import marshal | 
					
						
							| 
									
										
										
										
											2001-09-17 18:08:20 +00:00
										 |  |  | import os | 
					
						
							| 
									
										
										
										
											2000-10-09 14:35:24 +00:00
										 |  |  | import dis | 
					
						
							|  |  |  | import types | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def dump(obj): | 
					
						
							|  |  |  |     print obj | 
					
						
							|  |  |  |     for attr in dir(obj): | 
					
						
							| 
									
										
										
										
											2001-09-17 18:08:20 +00:00
										 |  |  |         if attr.startswith('co_'): | 
					
						
							|  |  |  |             val = getattr(obj, attr) | 
					
						
							|  |  |  |             print "\t", attr, repr(val) | 
					
						
							| 
									
										
										
										
											2000-10-09 14:35:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def loadCode(path): | 
					
						
							|  |  |  |     f = open(path) | 
					
						
							|  |  |  |     f.read(8) | 
					
						
							|  |  |  |     co = marshal.load(f) | 
					
						
							|  |  |  |     f.close() | 
					
						
							|  |  |  |     return co | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def walk(co, match=None): | 
					
						
							|  |  |  |     if match is None or co.co_name == match: | 
					
						
							|  |  |  |         dump(co) | 
					
						
							|  |  |  |         print | 
					
						
							|  |  |  |         dis.dis(co) | 
					
						
							|  |  |  |     for obj in co.co_consts: | 
					
						
							|  |  |  |         if type(obj) == types.CodeType: | 
					
						
							|  |  |  |             walk(obj, match) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def main(filename, codename=None): | 
					
						
							|  |  |  |     co = loadCode(filename) | 
					
						
							|  |  |  |     walk(co, codename) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     import sys | 
					
						
							|  |  |  |     if len(sys.argv) == 3: | 
					
						
							|  |  |  |         filename, codename = sys.argv[1:] | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         filename = sys.argv[1] | 
					
						
							|  |  |  |         codename = None | 
					
						
							| 
									
										
										
										
											2001-09-17 18:08:20 +00:00
										 |  |  |     if filename.endswith('.py') and os.path.exists(filename+"c"): | 
					
						
							|  |  |  |         filename += "c" | 
					
						
							| 
									
										
										
										
											2000-10-09 14:35:24 +00:00
										 |  |  |     main(filename, codename) |