2222from cwriter import CWriter
2323from typing import TextIO , Iterator
2424from lexer import Token
25- from stack import Local , Stack , StackError
25+ from stack import Local , Stack , StackError , Storage
2626
2727DEFAULT_OUTPUT = ROOT / "Python/partial_evaluator_cases.c.h"
2828DEFAULT_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
204193SKIPS = ("_EXTENDED_ARG" ,)
0 commit comments