docs: def iter_code_by_lines(self):
          """
          ((abs_line, rel_line, [(offset, code, args), ...]),
           ...)
          """
  
          lnt = self.get_linenumbertable()
          if not lnt:
              yield (None, None, self.disassemble())
              return
  
          lnt_offset = lnt[0][1]
  
          cur_line = None
          current = None
  
          for codelet in self.disassemble():
              abs_line = self.get_line_for_offset(codelet[0])
  
              if cur_line == abs_line:
                  current.append(codelet)
  
              else:
                  if cur_line is not None:
                      yield (cur_line, cur_line - lnt_offset, current)
                  cur_line = abs_line
                  current = [codelet]
  
          if current:
              yield (cur_line, cur_line - lnt_offset, current)