Skip to content

Commit d7ad950

Browse files
committed
Fix moved output names; support object pointers in cache
1 parent d84a5c3 commit d7ad950

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

Tools/cases_generator/generate_cases.py

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -73,25 +73,36 @@ def write(self, f: typing.TextIO, indent: str, dedent: int = 0) -> None:
7373
cache_offset = 0
7474
for ceffect in self.cache_effects:
7575
if ceffect.name != UNUSED:
76-
# TODO: if name is 'descr' use PyObject *descr = read_obj(...)
7776
bits = ceffect.size * BITS_PER_CODE_UNIT
78-
f.write(f"{indent} uint{bits}_t {ceffect.name} = ")
79-
if ceffect.size == 1:
80-
f.write(f"*(next_instr + {cache_offset});\n")
77+
if bits == 64:
78+
# NOTE: We assume that 64-bit data in the cache
79+
# is always an object pointer.
80+
# If this becomes false, we need a way to specify
81+
# syntactically what type the cache data is.
82+
f.write(
83+
f"{indent} PyObject *{ceffect.name} = "
84+
f"read_obj(next_instr + {cache_offset});\n"
85+
)
8186
else:
82-
f.write(f"read_u{bits}(next_instr + {cache_offset});\n")
87+
f.write(f"{indent} uint{bits}_t {ceffect.name} = ")
88+
if ceffect.size == 1:
89+
# There is no read_u16() helper function.
90+
f.write(f"*(next_instr + {cache_offset});\n")
91+
else:
92+
f.write(f"read_u{bits}(next_instr + {cache_offset});\n")
8393
cache_offset += ceffect.size
8494
assert cache_offset == self.cache_offset
8595

8696
# Write input stack effect variable declarations and initializations
87-
input_names = [seffect.name for seffect in self.input_effects]
8897
for i, seffect in enumerate(reversed(self.input_effects), 1):
8998
if seffect.name != UNUSED:
9099
f.write(f"{indent} PyObject *{seffect.name} = PEEK({i});\n")
91100

92101
# Write output stack effect variable declarations
102+
input_names = {seffect.name for seffect in self.input_effects}
103+
input_names.add(UNUSED)
93104
for seffect in self.output_effects:
94-
if seffect.name not in input_names and seffect.name != UNUSED:
105+
if seffect.name not in input_names:
95106
f.write(f"{indent} PyObject *{seffect.name};\n")
96107

97108
self.write_body(f, indent, dedent)
@@ -108,10 +119,13 @@ def write(self, f: typing.TextIO, indent: str, dedent: int = 0) -> None:
108119
f.write(f"{indent} STACK_SHRINK({-diff});\n")
109120

110121
# Write output stack effect assignments
111-
for i, output in enumerate(reversed(self.output_effects), 1):
112-
# TODO: Only skip if output occurs at same position as input
113-
if output.name not in input_names and output.name != UNUSED:
114-
f.write(f"{indent} POKE({i}, {output.name});\n")
122+
unmoved_names = {UNUSED}
123+
for ieffect, oeffect in zip(self.input_effects, self.output_effects):
124+
if ieffect.name == oeffect.name:
125+
unmoved_names.add(ieffect.name)
126+
for i, seffect in enumerate(reversed(self.output_effects)):
127+
if seffect.name not in unmoved_names:
128+
f.write(f"{indent} POKE({i+1}, {seffect.name});\n")
115129

116130
# Write cache effect
117131
if self.cache_offset:

0 commit comments

Comments
 (0)