Skip to content

Commit ba3979d

Browse files
committed
Add 'out' parameter to stack.pop
1 parent fbad220 commit ba3979d

File tree

6 files changed

+30
-30
lines changed

6 files changed

+30
-30
lines changed

Tools/cases_generator/cwriter.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import contextlib
22
from lexer import Token
33
from typing import TextIO, Iterator
4-
4+
from io import StringIO
55

66
class CWriter:
77
"A writer that understands tokens and how to format C code"
@@ -18,6 +18,10 @@ def __init__(self, out: TextIO, indent: int, line_directives: bool):
1818
self.pending_spill = False
1919
self.pending_reload = False
2020

21+
@staticmethod
22+
def null() -> "CWriter":
23+
return CWriter(StringIO(), 0, False)
24+
2125
def set_position(self, tkn: Token) -> None:
2226
if self.last_token is not None:
2327
if self.last_token.end_line < tkn.line:

Tools/cases_generator/optimizer_generator.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,9 @@ def decref_inputs(
7272

7373

7474
def emit_default(out: CWriter, uop: Uop, stack: Stack) -> None:
75+
null = CWriter.null()
7576
for var in reversed(uop.stack.inputs):
76-
stack.pop(var)
77+
stack.pop(var, null)
7778
offset = stack.base_offset - stack.physical_sp
7879
for var in uop.stack.outputs:
7980
if var.is_array() and not var.peek and not var.name == "unused":
@@ -123,9 +124,7 @@ def write_uop(
123124
try:
124125
out.start_line()
125126
if override:
126-
code_list, storage = Storage.for_uop(stack, prototype, check_liveness=False)
127-
for code in code_list:
128-
out.emit(code)
127+
storage = Storage.for_uop(stack, prototype, out, check_liveness=False)
129128
if debug:
130129
args = []
131130
for input in prototype.stack.inputs:

Tools/cases_generator/stack.py

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ def drop(self, var: StackItem, check_liveness: bool) -> None:
229229
if check_liveness:
230230
raise StackError(f"Dropping live value '{var.name}'")
231231

232-
def pop(self, var: StackItem) -> tuple[str, Local]:
232+
def pop(self, var: StackItem, out: CWriter) -> Local:
233233
self.logical_sp = self.logical_sp.pop(var)
234234
indirect = "&" if var.is_array() else ""
235235
if self.variables:
@@ -244,9 +244,9 @@ def pop(self, var: StackItem) -> tuple[str, Local]:
244244
f"Size mismatch when popping '{popped.name}' from stack to assign to '{var.name}'. "
245245
f"Expected {var_size(var)} got {var_size(popped.item)}"
246246
)
247-
return "", popped
247+
return popped
248248
if not var.used:
249-
return "", popped
249+
return popped
250250
if popped.name != var.name:
251251
rename = f"{var.name} = {popped.name};\n"
252252
popped.item = var
@@ -264,17 +264,18 @@ def pop(self, var: StackItem) -> tuple[str, Local]:
264264
popped.in_local = True
265265
else:
266266
defn = rename
267-
return defn, popped
267+
out.emit(defn)
268+
return popped
268269

269270
self.base_offset = self.logical_sp
270271
if var.name in UNUSED or not var.used:
271-
return "", Local.unused(var, self.base_offset)
272+
return Local.unused(var, self.base_offset)
272273
cast = f"({var.type})" if (not indirect and var.type) else ""
273274
bits = ".bits" if cast and self.extract_bits else ""
274275
offset = (self.base_offset - self.physical_sp).to_c()
275-
assign = f"{var.name} = {cast}{indirect}stack_pointer[{offset}]{bits};"
276-
assign = f"{assign}\n"
277-
return assign, Local.from_memory(var, self.base_offset)
276+
assign = f"{var.name} = {cast}{indirect}stack_pointer[{offset}]{bits};\n"
277+
out.emit(assign)
278+
return Local.from_memory(var, self.base_offset)
278279

279280
def push(self, var: Local) -> None:
280281
assert(var not in self.variables)
@@ -391,8 +392,9 @@ def stacks(inst: Instruction | PseudoInstruction) -> Iterator[StackEffect]:
391392

392393
def apply_stack_effect(stack: Stack, effect: StackEffect) -> None:
393394
locals: dict[str, Local] = {}
395+
null = CWriter.null()
394396
for var in reversed(effect.inputs):
395-
_, local = stack.pop(var)
397+
local = stack.pop(var, null)
396398
if var.name != "unused":
397399
locals[local.name] = local
398400
for var in effect.outputs:
@@ -518,13 +520,11 @@ def reload(self, out: CWriter) -> None:
518520
out.emit_reload()
519521

520522
@staticmethod
521-
def for_uop(stack: Stack, uop: Uop, check_liveness: bool = True) -> tuple[list[str], "Storage"]:
522-
code_list: list[str] = []
523+
def for_uop(stack: Stack, uop: Uop, out: CWriter, check_liveness: bool = True) -> "Storage":
523524
inputs: list[Local] = []
524525
peeks: list[Local] = []
525526
for input in reversed(uop.stack.inputs):
526-
code, local = stack.pop(input)
527-
code_list.append(code)
527+
local = stack.pop(input, out)
528528
if input.peek:
529529
peeks.append(local)
530530
else:
@@ -537,12 +537,12 @@ def for_uop(stack: Stack, uop: Uop, check_liveness: bool = True) -> tuple[list[s
537537
for ouput in uop.stack.outputs:
538538
if ouput.is_array() and ouput.used and not ouput.peek:
539539
c_offset = offset.to_c()
540-
code_list.append(f"{ouput.name} = &stack_pointer[{c_offset}];\n")
540+
out.emit(f"{ouput.name} = &stack_pointer[{c_offset}];\n")
541541
offset = offset.push(ouput)
542542
for var in inputs:
543543
stack.push(var)
544544
outputs = [ Local.undefined(var) for var in uop.stack.outputs if not var.peek ]
545-
return code_list, Storage(stack, inputs, outputs, check_liveness)
545+
return Storage(stack, inputs, outputs, check_liveness)
546546

547547
@staticmethod
548548
def copy_list(arg: list[Local]) -> list[Local]:
@@ -716,5 +716,4 @@ def close_variable(var: Local, overwrite: str) -> None:
716716
if output_in_place:
717717
self.stack.flush(out)
718718
if output is not None:
719-
code, output = self.stack.pop(output.item)
720-
out.emit(code)
719+
output = self.stack.pop(output.item, out)

Tools/cases_generator/tier1_generator.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,8 @@ def write_uop(
8585
if braces:
8686
emitter.out.emit(f"// {uop.name}\n")
8787
emitter.emit("{\n")
88-
code_list, storage = Storage.for_uop(stack, uop)
88+
storage = Storage.for_uop(stack, uop, emitter.out)
8989
emitter._print_storage(storage)
90-
for code in code_list:
91-
emitter.emit(code)
9290

9391
for cache in uop.caches:
9492
if cache.name != "unused":

Tools/cases_generator/tier2_generator.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ def declare_variable(
4646

4747
def declare_variables(uop: Uop, out: CWriter) -> None:
4848
stack = Stack()
49+
null = CWriter.null()
4950
for var in reversed(uop.stack.inputs):
50-
stack.pop(var)
51+
stack.pop(var, null)
5152
for var in uop.stack.outputs:
5253
stack.push(Local.undefined(var))
5354
seen = {"unused"}
@@ -142,9 +143,7 @@ def write_uop(uop: Uop, emitter: Emitter, stack: Stack) -> Stack:
142143
elif uop.properties.const_oparg >= 0:
143144
emitter.emit(f"oparg = {uop.properties.const_oparg};\n")
144145
emitter.emit(f"assert(oparg == CURRENT_OPARG());\n")
145-
code_list, storage = Storage.for_uop(stack, uop)
146-
for code in code_list:
147-
emitter.emit(code)
146+
storage = Storage.for_uop(stack, uop, emitter.out)
148147
idx = 0
149148
for cache in uop.caches:
150149
if cache.name != "unused":

Tools/cases_generator/uop_metadata_generator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,14 @@ def generate_names_and_flags(analysis: Analysis, out: CWriter) -> None:
4747
out.emit("};\n")
4848
out.emit("int _PyUop_num_popped(int opcode, int oparg)\n{\n")
4949
out.emit("switch(opcode) {\n")
50+
null = CWriter.null()
5051
for uop in analysis.uops.values():
5152
if uop.is_viable() and uop.properties.tier != 1:
5253
stack = Stack()
5354
for var in reversed(uop.stack.inputs):
5455
if var.peek:
5556
break
56-
stack.pop(var)
57+
stack.pop(var, null)
5758
popped = (-stack.base_offset).to_c()
5859
out.emit(f"case {uop.name}:\n")
5960
out.emit(f" return {popped};\n")

0 commit comments

Comments
 (0)