mirror of
https://github.com/python/cpython.git
synced 2025-07-19 01:05:26 +00:00
bpo-46841: Quicken code in-place (GH-31888)
* Moves the bytecode to the end of the corresponding PyCodeObject, and quickens it in-place. * Removes the almost-always-unused co_varnames, co_freevars, and co_cellvars member caches * _PyOpcode_Deopt is a new mapping from all opcodes to their un-quickened forms. * _PyOpcode_InlineCacheEntries is renamed to _PyOpcode_Caches * _Py_IncrementCountAndMaybeQuicken is renamed to _PyCode_Warmup * _Py_Quicken is renamed to _PyCode_Quicken * _co_quickened is renamed to _co_code_adaptive (and is now a read-only memoryview). * Do not emit unused nonzero opargs anymore in the compiler.
This commit is contained in:
parent
08eb754d84
commit
2bde6827ea
18 changed files with 832 additions and 688 deletions
|
@ -28,7 +28,7 @@ footer = """
|
|||
#endif /* !Py_OPCODE_H */
|
||||
"""
|
||||
|
||||
DEFINE = "#define {:<31} {:>3}\n"
|
||||
DEFINE = "#define {:<38} {:>3}\n"
|
||||
|
||||
UINT32_MASK = (1<<32)-1
|
||||
|
||||
|
@ -75,16 +75,27 @@ def main(opcode_py, outfile='Include/opcode.h'):
|
|||
fobj.write(DEFINE.format(name, next_op))
|
||||
used[next_op] = True
|
||||
fobj.write(DEFINE.format('DO_TRACING', 255))
|
||||
fobj.write("\nextern const uint8_t _PyOpcode_InlineCacheEntries[256];\n")
|
||||
fobj.write("\nextern const uint8_t _PyOpcode_Caches[256];\n")
|
||||
fobj.write("\nextern const uint8_t _PyOpcode_Deopt[256];\n")
|
||||
fobj.write("\n#ifdef NEED_OPCODE_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("\nconst uint8_t _PyOpcode_InlineCacheEntries[256] = {\n")
|
||||
fobj.write("\nconst uint8_t _PyOpcode_Caches[256] = {\n")
|
||||
for i, entries in enumerate(opcode["_inline_cache_entries"]):
|
||||
if entries:
|
||||
fobj.write(f" [{opname[i]}] = {entries},\n")
|
||||
fobj.write("};\n")
|
||||
deoptcodes = {}
|
||||
for basic in opmap:
|
||||
deoptcodes[basic] = basic
|
||||
for basic, family in opcode["_specializations"].items():
|
||||
for specialized in family:
|
||||
deoptcodes[specialized] = basic
|
||||
fobj.write("\nconst uint8_t _PyOpcode_Deopt[256] = {\n")
|
||||
for opt, deopt in sorted(deoptcodes.items()):
|
||||
fobj.write(f" [{opt}] = {deopt},\n")
|
||||
fobj.write("};\n")
|
||||
fobj.write("#endif /* OPCODE_TABLES */\n")
|
||||
|
||||
fobj.write("\n")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue