@@ -271,9 +271,6 @@ def write_body(self, out: Formatter, cache_adjust: int) -> None:
271
271
out .assign (var , oeffect )
272
272
273
273
274
- # TODO: Use a common base class for {Super,Macro}Instruction
275
-
276
-
277
274
@dataclasses .dataclass
278
275
class SuperOrMacroInstruction :
279
276
"""Common fields for super- and macro instructions."""
@@ -469,22 +466,9 @@ def analyze_super(self, super: parser.Super) -> SuperInstruction:
469
466
stack , initial_sp = self .stack_analysis (components )
470
467
sp = initial_sp
471
468
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 )
488
472
final_sp = sp
489
473
return SuperInstruction (super .name , stack , initial_sp , final_sp , super , parts )
490
474
@@ -498,20 +482,26 @@ def analyze_macro(self, macro: parser.Macro) -> MacroInstruction:
498
482
case parser .CacheEffect () as ceffect :
499
483
parts .append (ceffect )
500
484
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 )
510
487
case _:
511
488
typing .assert_never (component )
512
489
final_sp = sp
513
490
return MacroInstruction (macro .name , stack , initial_sp , final_sp , macro , parts )
514
491
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
+
515
505
def check_super_components (self , super : parser .Super ) -> list [Instruction ]:
516
506
components : list [Instruction ] = []
517
507
for op in super .ops :
0 commit comments