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)
((abs_line, rel_line, [(offset, code, args), ...]),
         ...)