mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			44 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			44 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | import compiler | ||
|  | import dis | ||
|  | import types | ||
|  | 
 | ||
|  | def extract_code_objects(co): | ||
|  |     l = [co] | ||
|  |     for const in co.co_consts: | ||
|  |         if type(const) == types.CodeType: | ||
|  |             l.append(const) | ||
|  |     return l | ||
|  | 
 | ||
|  | def compare(a, b): | ||
|  |     if not (a.co_name == "?" or a.co_name.startswith('<lambda')): | ||
|  |         assert a.co_name == b.co_name, (a, b) | ||
|  |     if a.co_stacksize != b.co_stacksize: | ||
|  |         print "stack mismatch %s: %d vs. %d" % (a.co_name, | ||
|  |                                                 a.co_stacksize, | ||
|  |                                                 b.co_stacksize) | ||
|  |         if a.co_stacksize > b.co_stacksize: | ||
|  |             print "good code" | ||
|  |             dis.dis(a) | ||
|  |             print "bad code" | ||
|  |             dis.dis(b) | ||
|  |             assert 0 | ||
|  | 
 | ||
|  | def main(files): | ||
|  |     for file in files: | ||
|  |         print file | ||
|  |         buf = open(file).read() | ||
|  |         try: | ||
|  |             co1 = compile(buf, file, "exec") | ||
|  |         except SyntaxError: | ||
|  |             print "skipped" | ||
|  |             continue | ||
|  |         co2 = compiler.compile(buf, file, "exec") | ||
|  |         co1l = extract_code_objects(co1) | ||
|  |         co2l = extract_code_objects(co2) | ||
|  |         for a, b in zip(co1l, co2l): | ||
|  |             compare(a, b) | ||
|  | 
 | ||
|  | if __name__ == "__main__": | ||
|  |     import sys | ||
|  |     main(sys.argv[1:]) |