mirror of
https://github.com/python/cpython.git
synced 2025-08-03 08:34:29 +00:00
bpo-41463: Generate information about jumps from 'opcode.py' rather than duplicating it in 'compile.c' (GH-21714)
Generate information about jumps from 'opcode.py' rather than duplicate it in 'compile.c'
This commit is contained in:
parent
c7decc27d5
commit
582aaf19e8
3 changed files with 114 additions and 59 deletions
|
@ -30,6 +30,18 @@ footer = """
|
|||
#endif /* !Py_OPCODE_H */
|
||||
"""
|
||||
|
||||
UINT32_MASK = (1<<32)-1
|
||||
|
||||
def write_int_array_from_ops(name, ops, out):
|
||||
bits = 0
|
||||
for op in ops:
|
||||
bits |= 1<<op
|
||||
out.write(f"static uint32_t {name}[8] = {{\n")
|
||||
for i in range(8):
|
||||
out.write(f" {bits & UINT32_MASK}U,\n")
|
||||
bits >>= 32
|
||||
assert bits == 0
|
||||
out.write(f"}};\n")
|
||||
|
||||
def main(opcode_py, outfile='Include/opcode.h'):
|
||||
opcode = {}
|
||||
|
@ -41,6 +53,8 @@ def main(opcode_py, outfile='Include/opcode.h'):
|
|||
code = fp.read()
|
||||
exec(code, opcode)
|
||||
opmap = opcode['opmap']
|
||||
hasjrel = opcode['hasjrel']
|
||||
hasjabs = opcode['hasjabs']
|
||||
with open(outfile, 'w') as fobj:
|
||||
fobj.write(header)
|
||||
for name in opcode['opname']:
|
||||
|
@ -49,8 +63,13 @@ def main(opcode_py, outfile='Include/opcode.h'):
|
|||
if name == 'POP_EXCEPT': # Special entry for HAVE_ARGUMENT
|
||||
fobj.write("#define %-23s %3d\n" %
|
||||
('HAVE_ARGUMENT', opcode['HAVE_ARGUMENT']))
|
||||
fobj.write("#ifdef NEED_OPCODE_JUMP_TABLES\n")
|
||||
write_int_array_from_ops("_PyOpcode_RelativeJump", opcode['hasjrel'], fobj)
|
||||
write_int_array_from_ops("_PyOpcode_Jump", opcode['hasjrel'] + opcode['hasjabs'], fobj)
|
||||
fobj.write("#endif /* OPCODE_TABLES */\n")
|
||||
fobj.write(footer)
|
||||
|
||||
|
||||
print("%s regenerated from %s" % (outfile, opcode_py))
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue