Generate various line-related helper data.
(self, code_obj)
| 232 | return bytecode |
| 233 | |
| 234 | def build_lines_data(self, code_obj): |
| 235 | """ |
| 236 | Generate various line-related helper data. |
| 237 | """ |
| 238 | |
| 239 | # Offset: lineno pairs, only for offsets which start line. |
| 240 | # Locally we use list for more convenient iteration using indices |
| 241 | linestarts = list(self.opc.findlinestarts(code_obj)) |
| 242 | self.linestarts = dict(linestarts) |
| 243 | if not self.linestarts: |
| 244 | return [] |
| 245 | |
| 246 | # 'List-map' which shows line number of current op and offset of |
| 247 | # first op on following line, given offset of op as index |
| 248 | lines = [] |
| 249 | LineTuple = namedtuple("LineTuple", ["l_no", "next"]) |
| 250 | |
| 251 | # Iterate through available linestarts, and fill |
| 252 | # the data for all code offsets encountered until |
| 253 | # last linestart offset |
| 254 | _, prev_line_no = linestarts[0] |
| 255 | offset = 0 |
| 256 | for start_offset, line_no in linestarts[1:]: |
| 257 | while offset < start_offset: |
| 258 | lines.append(LineTuple(prev_line_no, start_offset)) |
| 259 | offset += 1 |
| 260 | prev_line_no = line_no |
| 261 | |
| 262 | # Fill remaining offsets with reference to last line number |
| 263 | # and code length as start offset of following non-existing line |
| 264 | codelen = len(self.code) |
| 265 | while offset < codelen: |
| 266 | lines.append(LineTuple(prev_line_no, codelen)) |
| 267 | offset += 1 |
| 268 | return lines |
| 269 | |
| 270 | def build_prev_op(self): |
| 271 | """ |
no test coverage detected