@@ -271,9 +271,6 @@ def write_body(self, out: Formatter, cache_adjust: int) -> None:
271271 out .assign (var , oeffect )
272272
273273
274- # TODO: Use a common base class for {Super,Macro}Instruction
275-
276-
277274@dataclasses .dataclass
278275class SuperOrMacroInstruction :
279276 """Common fields for super- and macro instructions."""
@@ -469,22 +466,9 @@ def analyze_super(self, super: parser.Super) -> SuperInstruction:
469466 stack , initial_sp = self .stack_analysis (components )
470467 sp = initial_sp
471468 parts : list [Component ] = []
472- for component in components :
473- match component :
474- case parser .CacheEffect () as ceffect :
475- parts .append (ceffect )
476- case Instruction () as instr :
477- input_mapping : StackEffectMapping = []
478- for ieffect in reversed (instr .input_effects ):
479- sp -= 1
480- input_mapping .append ((stack [sp ], ieffect ))
481- output_mapping : StackEffectMapping = []
482- for oeffect in instr .output_effects :
483- output_mapping .append ((stack [sp ], oeffect ))
484- sp += 1
485- parts .append (Component (instr , input_mapping , output_mapping ))
486- case _:
487- typing .assert_never (component )
469+ for instr in components :
470+ part , sp = self .analyze_instruction (instr , stack , sp )
471+ parts .append (part )
488472 final_sp = sp
489473 return SuperInstruction (super .name , stack , initial_sp , final_sp , super , parts )
490474
@@ -498,20 +482,26 @@ def analyze_macro(self, macro: parser.Macro) -> MacroInstruction:
498482 case parser .CacheEffect () as ceffect :
499483 parts .append (ceffect )
500484 case Instruction () as instr :
501- input_mapping : StackEffectMapping = []
502- for ieffect in reversed (instr .input_effects ):
503- sp -= 1
504- input_mapping .append ((stack [sp ], ieffect ))
505- output_mapping : StackEffectMapping = []
506- for oeffect in instr .output_effects :
507- output_mapping .append ((stack [sp ], oeffect ))
508- sp += 1
509- parts .append (Component (instr , input_mapping , output_mapping ))
485+ part , sp = self .analyze_instruction (instr , stack , sp )
486+ parts .append (part )
510487 case _:
511488 typing .assert_never (component )
512489 final_sp = sp
513490 return MacroInstruction (macro .name , stack , initial_sp , final_sp , macro , parts )
514491
492+ def analyze_instruction (
493+ self , instr : Instruction , stack : list [StackEffect ], sp : int
494+ ) -> tuple [Component , int ]:
495+ input_mapping : StackEffectMapping = []
496+ for ieffect in reversed (instr .input_effects ):
497+ sp -= 1
498+ input_mapping .append ((stack [sp ], ieffect ))
499+ output_mapping : StackEffectMapping = []
500+ for oeffect in instr .output_effects :
501+ output_mapping .append ((stack [sp ], oeffect ))
502+ sp += 1
503+ return Component (instr , input_mapping , output_mapping ), sp
504+
515505 def check_super_components (self , super : parser .Super ) -> list [Instruction ]:
516506 components : list [Instruction ] = []
517507 for op in super .ops :
0 commit comments