mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 11:49:12 +00:00 
			
		
		
		
	PyType_GetSlot() can now accept static types. Co-Authored-By: Petr Viktorin <encukou@gmail.com> Automerge-Triggered-By: GH:encukou
		
			
				
	
	
		
			51 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/python
 | 
						|
# Usage: typeslots.py < Include/typeslots.h typeslots.inc
 | 
						|
 | 
						|
import sys, re
 | 
						|
 | 
						|
 | 
						|
def generate_typeslots(out=sys.stdout):
 | 
						|
    out.write("/* Generated by typeslots.py */\n")
 | 
						|
    res = {}
 | 
						|
    for line in sys.stdin:
 | 
						|
        m = re.match("#define Py_([a-z_]+) ([0-9]+)", line)
 | 
						|
        if not m:
 | 
						|
            continue
 | 
						|
 | 
						|
        member = m.group(1)
 | 
						|
        if member.startswith("tp_"):
 | 
						|
            member = f'{{-1, offsetof(PyTypeObject, {member})}}'
 | 
						|
        elif member.startswith("am_"):
 | 
						|
            member = (f'{{offsetof(PyAsyncMethods, {member}),'+
 | 
						|
                      ' offsetof(PyTypeObject, tp_as_async)}')
 | 
						|
        elif member.startswith("nb_"):
 | 
						|
            member = (f'{{offsetof(PyNumberMethods, {member}),'+
 | 
						|
                      ' offsetof(PyTypeObject, tp_as_number)}')
 | 
						|
        elif member.startswith("mp_"):
 | 
						|
            member = (f'{{offsetof(PyMappingMethods, {member}),'+
 | 
						|
                      ' offsetof(PyTypeObject, tp_as_mapping)}')
 | 
						|
        elif member.startswith("sq_"):
 | 
						|
            member = (f'{{offsetof(PySequenceMethods, {member}),'+
 | 
						|
                      ' offsetof(PyTypeObject, tp_as_sequence)}')
 | 
						|
        elif member.startswith("bf_"):
 | 
						|
            member = (f'{{offsetof(PyBufferProcs, {member}),'+
 | 
						|
                      ' offsetof(PyTypeObject, tp_as_buffer)}')
 | 
						|
        res[int(m.group(2))] = member
 | 
						|
 | 
						|
    M = max(res.keys())+1
 | 
						|
    for i in range(1,M):
 | 
						|
        if i in res:
 | 
						|
            out.write("%s,\n" % res[i])
 | 
						|
        else:
 | 
						|
            out.write("{0, 0},\n")
 | 
						|
 | 
						|
 | 
						|
def main():
 | 
						|
    if len(sys.argv) == 2:
 | 
						|
        with open(sys.argv[1], "w") as f:
 | 
						|
            generate_typeslots(f)
 | 
						|
    else:
 | 
						|
        generate_typeslots()
 | 
						|
 | 
						|
if __name__ == "__main__":
 | 
						|
    main()
 |