runInstr :: Instr -> ConstPool -> InstrState
runInstr instr cp = multiPass 0 emptyInstrState { isRunAgain = True }
  where multiPass :: Int -> InstrState -> InstrState
        multiPass n s@InstrState { isRunAgain, isLabelTable = lt }
          | isRunAgain =
            case runInstr' instr cp $ emptyInstrState { isLabelTable = lt } of
              s' -> multiPass (n + 1) s'
          | otherwise = s
runInstr :: Instr -> ConstPool -> InstrState
runInstr instr cp = multiPass 0 emptyInstrState { isRunAgain = True }
  where multiPass :: Int -> InstrState -> InstrState
        multiPass n s@InstrState { isRunAgain, isLabelTable = lt }
          | isRunAgain =
            case runInstr' instr cp $ emptyInstrState { isLabelTable = lt } of
              s' -> multiPass (n + 1) s'
          | otherwise = s
runInstr instr cp = multiPass 0 emptyInstrState { isRunAgain = True }
  where multiPass :: Int -> InstrState -> InstrState
        multiPass n s@InstrState { isRunAgain, isLabelTable = lt }
          | isRunAgain =
            case runInstr' instr cp $ emptyInstrState { isLabelTable = lt } of
              s' -> multiPass (n + 1) s'
          | otherwise = s