MCPcopy
hub / github.com/rocky/python-uncompyle6 / build_statement_indices

Method build_statement_indices

uncompyle6/scanners/scanner2.py:504–592  ·  view source on GitHub ↗
(self)

Source from the content-addressed store, hash-verified

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

Callers 1

find_jump_targetsMethod · 0.95

Calls 7

all_instrMethod · 0.80
op_rangeMethod · 0.80
addMethod · 0.80
sortMethod · 0.80
get_targetMethod · 0.80
opname_for_offsetMethod · 0.80
removeMethod · 0.45

Tested by

no test coverage detected