Skip to content

Commit c9d41bc

Browse files
authored
gh-91428: include specialized opcodes in _PyOpcode_OpName (GH-91467)
1 parent 1b6cd87 commit c9d41bc

File tree

2 files changed

+167
-8
lines changed

2 files changed

+167
-8
lines changed

Include/opcode.h

Lines changed: 146 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tools/scripts/generate_opcode_h.py

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,22 @@ def main(opcode_py, outfile='Include/opcode.h'):
5959
hasjabs = opcode['hasjabs']
6060
used = [ False ] * 256
6161
next_op = 1
62+
6263
for name, op in opmap.items():
6364
used[op] = True
65+
66+
specialized_opmap = {}
67+
opname_including_specialized = opname.copy()
68+
for name in opcode['_specialized_instructions']:
69+
while used[next_op]:
70+
next_op += 1
71+
specialized_opmap[name] = next_op
72+
opname_including_specialized[next_op] = name
73+
used[next_op] = True
74+
specialized_opmap['DO_TRACING'] = 255
75+
opname_including_specialized[255] = 'DO_TRACING'
76+
used[255] = True
77+
6478
with open(outfile, 'w') as fobj:
6579
fobj.write(header)
6680
for name in opname:
@@ -69,12 +83,9 @@ def main(opcode_py, outfile='Include/opcode.h'):
6983
if name == 'POP_EXCEPT': # Special entry for HAVE_ARGUMENT
7084
fobj.write(DEFINE.format("HAVE_ARGUMENT", opcode["HAVE_ARGUMENT"]))
7185

72-
for name in opcode['_specialized_instructions']:
73-
while used[next_op]:
74-
next_op += 1
75-
fobj.write(DEFINE.format(name, next_op))
76-
used[next_op] = True
77-
fobj.write(DEFINE.format('DO_TRACING', 255))
86+
for name, op in specialized_opmap.items():
87+
fobj.write(DEFINE.format(name, op))
88+
7889
fobj.write("\nextern const uint8_t _PyOpcode_Caches[256];\n")
7990
fobj.write("\nextern const uint8_t _PyOpcode_Deopt[256];\n")
8091
fobj.write("\n#ifdef NEED_OPCODE_TABLES\n")
@@ -111,8 +122,10 @@ def main(opcode_py, outfile='Include/opcode.h'):
111122
fobj.write("\n")
112123
fobj.write("#ifdef Py_DEBUG\n")
113124
fobj.write("static const char *const _PyOpcode_OpName[256] = {\n")
114-
for name in opmap:
115-
fobj.write(f''' [{name}] = "{name}",\n''')
125+
for op, name in enumerate(opname_including_specialized):
126+
if name[0] != "<":
127+
op = name
128+
fobj.write(f''' [{op}] = "{name}",\n''')
116129
fobj.write("};\n")
117130
fobj.write("#endif\n")
118131

0 commit comments

Comments
 (0)