mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			43 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:])
 |