Skip to content

Commit b2f4fa6

Browse files
update
1 parent 06d5311 commit b2f4fa6

File tree

2 files changed

+90
-31
lines changed

2 files changed

+90
-31
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// This file is generated by Tools/cases_generator/partial_evaluator_generator.py
2+
// from:
3+
// Python/partial_evaluator_bytecodes.c
4+
// Do not edit!
5+
6+
case _NOP: {
7+
break;
8+
}
9+
10+
case _CHECK_PERIODIC: {
11+
MATERIALIZE_INST();
12+
materialize_ctx(ctx);
13+
break;
14+
}
15+
16+
case _CHECK_PERIODIC_IF_NOT_YIELD_FROM: {
17+
MATERIALIZE_INST();
18+
materialize_ctx(ctx);
19+
break;
20+
}
21+
22+
/* _QUICKEN_RESUME is not a viable micro-op for tier 2 */
23+
24+
case _RESUME_CHECK: {
25+
MATERIALIZE_INST();
26+
break;
27+
}
28+
29+
/* _MONITOR_RESUME is not a viable micro-op for tier 2 */
30+
31+
case _LOAD_FAST_CHECK: {
32+
_Py_UopsPESlot value;
33+
MATERIALIZE_INST();
34+
value = GETLOCAL(oparg);
35+
// We guarantee this will error - just bail and don't optimize it.
36+
if (sym_is_null(&value)) {
37+
ctx->done = true;
38+
}
39+
stack_pointer[0] = value;
40+
stack_pointer += 1;
41+
assert(WITHIN_STACK_BOUNDS());
42+
break;
43+
}
44+
45+
case _LOAD_FAST: {
46+
_Py_UopsPESlot value;
47+
value = GETLOCAL(oparg);
48+
sym_set_origin_inst_override(&value, this_instr);
49+
stack_pointer[0] = value;
50+
stack_pointer += 1;
51+
assert(WITHIN_STACK_BOUNDS());
52+
break;
53+
}
54+
55+
case _LOAD_FAST_AND_CLEAR: {
56+
_Py_UopsPESlot value;
57+
MATERIALIZE_INST();
58+
value = GETLOCAL(oparg);
59+
GETLOCAL(oparg) = sym_new_null(ctx);
60+
sym_set_origin_inst_override(&value, this_instr);
61+
stack_pointer[0] = value;
62+
stack_pointer += 1;
63+
assert(WITHIN_STACK_BOUNDS());
64+
break;
65+
}
66+
67+
case _LOAD_CONST: {
68+
_Py_UopsPESlot value;
69+
// Should've all been converted by specializer.
70+
Py_UNREACHABLE();

Tools/cases_generator/partial_evaluator_generator.py

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from cwriter import CWriter
2323
from typing import TextIO, Iterator
2424
from lexer import Token
25-
from stack import Local, Stack, StackError
25+
from stack import Local, Stack, StackError, Storage
2626

2727
DEFAULT_OUTPUT = ROOT / "Python/partial_evaluator_cases.c.h"
2828
DEFAULT_ABSTRACT_INPUT = (ROOT / "Python/partial_evaluator_bytecodes.c").absolute().as_posix()
@@ -78,7 +78,7 @@ def declare_variables(uop: Uop, out: CWriter) -> None:
7878

7979

8080

81-
def emit_default(out: CWriter, uop: Uop) -> None:
81+
def emit_default(out: CWriter, uop: Uop, stack: Stack) -> None:
8282
out.emit("MATERIALIZE_INST();\n")
8383
unused_count = 0
8484
if uop.properties.escapes:
@@ -152,26 +152,18 @@ def write_uop(
152152
debug: bool,
153153
) -> None:
154154
locals: dict[str, Local] = {}
155-
unused_count = 0
155+
prototype = override if override else uop
156156
try:
157-
prototype = override if override else uop
158-
is_override = override is not None
159157
out.start_line()
160-
for var in reversed(prototype.stack.inputs):
161-
name, unused_count = var_name(var, unused_count)
162-
old_name = var.name
163-
var.name = name
164-
code, local = stack.pop(var, extract_bits=True, assign_unused=True)
165-
var.name = old_name
166-
out.emit(code)
167-
if local.defined:
168-
locals[name] = local
169-
out.emit(stack.define_output_arrays(prototype.stack.outputs))
158+
if override:
159+
code_list, storage = Storage.for_uop(stack, prototype, extract_bits=False)
160+
for code in code_list:
161+
out.emit(code)
170162
if debug:
171163
args = []
172-
for var in prototype.stack.inputs:
173-
if not var.peek or is_override:
174-
args.append(var.name)
164+
for input in prototype.stack.inputs:
165+
if not input.peek or override:
166+
args.append(input.name)
175167
out.emit(f'DEBUG_PRINTF({", ".join(args)});\n')
176168
if override:
177169
for cache in uop.caches:
@@ -184,21 +176,18 @@ def write_uop(
184176
out.emit(f"{type}{cache.name} = ({cast})this_instr->operand;\n")
185177
if override:
186178
emitter = Tier2PEEmitter(out)
187-
emitter.emit_tokens(override, stack, None)
179+
# No reference management of inputs needed.
180+
for var in storage.inputs: # type: ignore[possibly-undefined]
181+
var.defined = False
182+
storage = emitter.emit_tokens(override, storage, None)
183+
out.start_line()
184+
storage.flush(out, cast_type="", extract_bits=False)
188185
else:
189-
emit_default(out, uop)
190-
191-
192-
for var in prototype.stack.outputs:
193-
if var.name in locals:
194-
local = locals[var.name]
195-
else:
196-
local = Local.local(var)
197-
stack.push(local)
198-
out.start_line()
199-
stack.flush(out, cast_type="", extract_bits=True)
186+
emit_default(out, uop, stack)
187+
out.start_line()
188+
stack.flush(out, cast_type="", extract_bits=False)
200189
except StackError as ex:
201-
raise analysis_error(ex.args[0], uop.body[0])
190+
raise analysis_error(ex.args[0], prototype.body[0]) # from None
202191

203192

204193
SKIPS = ("_EXTENDED_ARG",)

0 commit comments

Comments
 (0)