(self)
| 502 | return new_tokens, customize |
| 503 | |
| 504 | def build_statement_indices(self): |
| 505 | code = self.code |
| 506 | start = 0 |
| 507 | end = len(code) |
| 508 | |
| 509 | stmt_opcode_seqs = frozenset( |
| 510 | [ |
| 511 | (self.opc.PJIF, self.opc.JUMP_FORWARD), |
| 512 | (self.opc.PJIF, self.opc.JUMP_ABSOLUTE), |
| 513 | (self.opc.PJIT, self.opc.JUMP_FORWARD), |
| 514 | (self.opc.PJIT, self.opc.JUMP_ABSOLUTE), |
| 515 | ] |
| 516 | ) |
| 517 | |
| 518 | prelim = self.all_instr(start, end, self.statement_opcodes) |
| 519 | |
| 520 | stmts = self.stmts = set(prelim) |
| 521 | pass_stmts = set() |
| 522 | for seq in stmt_opcode_seqs: |
| 523 | for i in self.op_range(start, end - (len(seq) + 1)): |
| 524 | match = True |
| 525 | for elem in seq: |
| 526 | if elem != code[i]: |
| 527 | match = False |
| 528 | break |
| 529 | i += instruction_size(code[i], self.opc) |
| 530 | |
| 531 | if match: |
| 532 | i = self.prev[i] |
| 533 | stmts.add(i) |
| 534 | pass_stmts.add(i) |
| 535 | |
| 536 | if pass_stmts: |
| 537 | stmt_list = list(stmts) |
| 538 | stmt_list.sort() |
| 539 | else: |
| 540 | stmt_list = prelim |
| 541 | last_stmt = -1 |
| 542 | self.next_stmt = [] |
| 543 | slist = self.next_stmt = [] |
| 544 | i = 0 |
| 545 | for s in stmt_list: |
| 546 | if code[s] == self.opc.JUMP_ABSOLUTE and s not in pass_stmts: |
| 547 | target = self.get_target(s) |
| 548 | if target > s or ( |
| 549 | self.lines and self.lines[last_stmt].l_no == self.lines[s].l_no |
| 550 | ): |
| 551 | stmts.remove(s) |
| 552 | continue |
| 553 | j = self.prev[s] |
| 554 | while code[j] == self.opc.JUMP_ABSOLUTE: |
| 555 | j = self.prev[j] |
| 556 | if ( |
| 557 | self.version >= (2, 3) |
| 558 | and self.opname_for_offset(j) == "LIST_APPEND" |
| 559 | ): # list comprehension |
| 560 | stmts.remove(s) |
| 561 | continue |
no test coverage detected