Skip to content

Commit 46c079a

Browse files
Cleanup cases generator
1 parent 5af4b0a commit 46c079a

File tree

5 files changed

+45
-36
lines changed

5 files changed

+45
-36
lines changed

Include/internal/pycore_opcode_metadata.h

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Python/bytecodes.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5485,33 +5485,33 @@ dummy_func(
54855485
}
54865486

54875487
tier2 op(_GUARD_IP__PUSH_FRAME, (ip/4 --)) {
5488-
_Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP;
5488+
_Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(_PUSH_FRAME);
54895489
if (target != (_Py_CODEUNIT *)ip) {
5490-
frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP;
5490+
frame->instr_ptr += OFFSET_OF(_PUSH_FRAME);
54915491
EXIT_IF(true);
54925492
}
54935493
}
54945494

54955495
tier2 op(_GUARD_IP_YIELD_VALUE, (ip/4 --)) {
5496-
_Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP;
5496+
_Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(YIELD_VALUE);
54975497
if (target != (_Py_CODEUNIT *)ip) {
5498-
frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP;
5498+
frame->instr_ptr += OFFSET_OF(YIELD_VALUE);
54995499
EXIT_IF(true);
55005500
}
55015501
}
55025502

55035503
tier2 op(_GUARD_IP_RETURN_VALUE, (ip/4 --)) {
5504-
_Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP;
5504+
_Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(RETURN_VALUE);
55055505
if (target != (_Py_CODEUNIT *)ip) {
5506-
frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP;
5506+
frame->instr_ptr += OFFSET_OF(RETURN_VALUE);
55075507
EXIT_IF(true);
55085508
}
55095509
}
55105510

55115511
tier2 op(_GUARD_IP_RETURN_GENERATOR, (ip/4 --)) {
5512-
_Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF_CORRESPONDING_UOP;
5512+
_Py_CODEUNIT *target = frame->instr_ptr + OFFSET_OF(RETURN_GENERATOR);
55135513
if (target != (_Py_CODEUNIT *)ip) {
5514-
frame->instr_ptr += OFFSET_OF_CORRESPONDING_UOP;
5514+
frame->instr_ptr += OFFSET_OF(RETURN_GENERATOR);
55155515
EXIT_IF(true);
55165516
}
55175517
}

Python/executor_cases.c.h

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

Tools/cases_generator/analyzer.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -984,7 +984,10 @@ def compute_properties(op: parser.CodeDef) -> Properties:
984984
no_save_ip=no_save_ip,
985985
tier=tier_variable(op),
986986
needs_prev=variable_used(op, "prev_instr"),
987-
needs_guard_ip=(isinstance(op, parser.InstDef) and (unpredictable_jump and "replaced" not in op.annotations)) or variable_used(op, "LLTRACE_RESUME_FRAME") or variable_used(op, "DISPATCH_INLINED"),
987+
needs_guard_ip=(isinstance(op, parser.InstDef)
988+
and (unpredictable_jump and "replaced" not in op.annotations))
989+
or variable_used(op, "LOAD_IP")
990+
or variable_used(op, "DISPATCH_INLINED"),
988991
unpredictable_jump=unpredictable_jump,
989992
)
990993

Tools/cases_generator/tier2_generator.py

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class Tier2Emitter(Emitter):
6363
def __init__(self, out: CWriter, labels: dict[str, Label]):
6464
super().__init__(out, labels)
6565
self._replacers["oparg"] = self.oparg
66-
self._replacers["OFFSET_OF_CORRESPONDING_UOP"] = self.offset_of_corresponding_uop
66+
self._replacers["OFFSET_OF"] = self.offset_of
6767

6868
def goto_error(self, offset: int, storage: Storage) -> str:
6969
# To do: Add jump targets for popping values.
@@ -135,7 +135,7 @@ def oparg(
135135
self.out.emit_at(uop.name[-1], tkn)
136136
return True
137137

138-
def offset_of_corresponding_uop(
138+
def offset_of(
139139
self,
140140
tkn: Token,
141141
tkn_iter: TokenIterator,
@@ -144,14 +144,21 @@ def offset_of_corresponding_uop(
144144
inst: Instruction | None,
145145
) -> bool:
146146
assert uop.name.startswith("_GUARD_IP")
147-
rest = uop.name[len("_GUARD_IP"):]
148-
self.emit(f" OFFSET_OF{rest};\n")
147+
# LPAREN
148+
next(tkn_iter)
149+
inst = next(tkn_iter)
150+
self.emit(f" OFFSET_OF_{inst.text};\n")
151+
# RPAREN
152+
next(tkn_iter)
153+
# SEMI
149154
next(tkn_iter)
150155
return True
151156

152-
def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack:
157+
def write_uop(uop: Uop, emitter: Emitter, stack: Stack, offset_strs: dict[str, tuple[str, str]]) -> Stack:
153158
locals: dict[str, Local] = {}
154159
try:
160+
if name_offset_pair := offset_strs.get(uop.name):
161+
emitter.emit(f"#define OFFSET_OF_{name_offset_pair[0]} ({name_offset_pair[1]})\n")
155162
emitter.out.start_line()
156163
if uop.properties.oparg:
157164
emitter.emit("oparg = CURRENT_OPARG();\n")
@@ -172,28 +179,16 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack:
172179
idx += 1
173180
_, storage = emitter.emit_tokens(uop, storage, None, False)
174181
storage.flush(emitter.out)
182+
if name_offset_pair:
183+
emitter.emit(f"#undef OFFSET_OF_{name_offset_pair[0]}\n")
175184
except StackError as ex:
176185
raise analysis_error(ex.args[0], uop.body.open) from None
177186
return storage.stack
178187

179188
SKIPS = ("_EXTENDED_ARG",)
180189

181190

182-
def generate_tier2(
183-
filenames: list[str], analysis: Analysis, outfile: TextIO, lines: bool
184-
) -> None:
185-
write_header(__file__, filenames, outfile)
186-
outfile.write(
187-
"""
188-
#ifdef TIER_ONE
189-
#error "This file is for Tier 2 only"
190-
#endif
191-
#define TIER_TWO 2
192-
"""
193-
)
194-
out = CWriter(outfile, 2, lines)
195-
emitter = Tier2Emitter(out, analysis.labels)
196-
out.emit("\n")
191+
def populate_offset_strs(analysis: Analysis) -> dict[str, tuple[str, str]]:
197192
offset_strs: dict[str, tuple[str, str]] = {}
198193
for name, uop in analysis.uops.items():
199194
if not f"_GUARD_IP_{name}" in analysis.uops:
@@ -214,7 +209,23 @@ def generate_tier2(
214209
found = True
215210
assert offset_str
216211
offset_strs[f"_GUARD_IP_{name}"] = (name, offset_str)
212+
return offset_strs
217213

214+
def generate_tier2(
215+
filenames: list[str], analysis: Analysis, outfile: TextIO, lines: bool
216+
) -> None:
217+
write_header(__file__, filenames, outfile)
218+
outfile.write(
219+
"""
220+
#ifdef TIER_ONE
221+
#error "This file is for Tier 2 only"
222+
#endif
223+
#define TIER_TWO 2
224+
"""
225+
)
226+
out = CWriter(outfile, 2, lines)
227+
emitter = Tier2Emitter(out, analysis.labels)
228+
offset_strs = populate_offset_strs(analysis)
218229
out.emit("\n")
219230

220231
for name, uop in analysis.uops.items():
@@ -231,11 +242,7 @@ def generate_tier2(
231242
out.emit(f"case {uop.name}: {{\n")
232243
declare_variables(uop, out)
233244
stack = Stack()
234-
if name_offset_pair := offset_strs.get(name):
235-
out.emit(f"#define OFFSET_OF_{name_offset_pair[0]} ({name_offset_pair[1]})\n")
236-
stack = write_uop(uop, emitter, stack)
237-
if name_offset_pair:
238-
out.emit(f"#undef OFFSET_OF_{name_offset_pair[0]}\n")
245+
stack = write_uop(uop, emitter, stack, offset_strs)
239246
out.start_line()
240247
if not uop.properties.always_exits:
241248
out.emit("break;\n")

0 commit comments

Comments
 (0)