From 8bc76f19b994cc62e5b2e99160b773e1f78694d6 Mon Sep 17 00:00:00 2001 From: rocky Date: Fri, 23 Sep 2016 19:09:23 -0400 Subject: [PATCH] Tidy use of SETUP_ ops Also possibly remove a bug in decompiling Python 3.0 .. 3.2 which doesn't have SETUP_WITH --- uncompyle6/scanners/scanner3.py | 44 +++++++++++++++++---------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/uncompyle6/scanners/scanner3.py b/uncompyle6/scanners/scanner3.py index 310ba71b..74a08050 100644 --- a/uncompyle6/scanners/scanner3.py +++ b/uncompyle6/scanners/scanner3.py @@ -52,27 +52,36 @@ class Scanner3(Scanner): # Create opcode classification sets # Note: super initilization above initializes self.opc + # Ops that start SETUP_ ... We will COME_FROM with these names + # Some blocks and END_ statements. And they can start + # a new statement + setup_ops = [self.opc.SETUP_LOOP, self.opc.SETUP_EXCEPT, + self.opc.SETUP_FINALLY] + + if self.version >= 3.2: + setup_ops.append(self.opc.SETUP_WITH) + self.setup_ops = frozenset(setup_ops) + + self.setup_ops_no_loop = frozenset(setup_ops) - frozenset([self.opc.SETUP_LOOP]) + # Opcodes that can start a statement. statement_opcodes = [ - self.opc.SETUP_LOOP, self.opc.BREAK_LOOP, self.opc.CONTINUE_LOOP, - self.opc.SETUP_FINALLY, self.opc.END_FINALLY, self.opc.SETUP_EXCEPT, - self.opc.POP_BLOCK, self.opc.STORE_FAST, self.opc.DELETE_FAST, - self.opc.STORE_DEREF, + self.opc.BREAK_LOOP, self.opc.CONTINUE_LOOP, + self.opc.POP_BLOCK, self.opc.STORE_FAST, + self.opc.DELETE_FAST, self.opc.STORE_DEREF, - self.opc.STORE_GLOBAL, self.opc.DELETE_GLOBAL, self.opc.STORE_NAME, - self.opc.DELETE_NAME, + self.opc.STORE_GLOBAL, self.opc.DELETE_GLOBAL, + self.opc.STORE_NAME, self.opc.DELETE_NAME, - self.opc.STORE_ATTR, self.opc.DELETE_ATTR, self.opc.STORE_SUBSCR, - self.opc.DELETE_SUBSCR, + self.opc.STORE_ATTR, self.opc.DELETE_ATTR, + self.opc.STORE_SUBSCR, self.opc.POP_TOP, + self.opc.DELETE_SUBSCR, self.opc.END_FINALLY, - self.opc.RETURN_VALUE, self.opc.RAISE_VARARGS, self.opc.POP_TOP, + self.opc.RETURN_VALUE, self.opc.RAISE_VARARGS, self.opc.PRINT_EXPR, self.opc.JUMP_ABSOLUTE ] - if version >= 3.2: - statement_opcodes.append(self.opc.SETUP_WITH) - - self.statement_opcodes = frozenset(statement_opcodes) + self.statement_opcodes = frozenset(statement_opcodes) | self.setup_ops_no_loop # Opcodes that can start a designator non-terminal. # FIXME: JUMP_ABSOLUTE is weird. What's up with that? @@ -103,13 +112,6 @@ class Scanner3(Scanner): varargs_ops.add(self.opc.CALL_METHOD) self.varargs_ops = frozenset(varargs_ops) - setup_ops = [self.opc.SETUP_LOOP, self.opc.SETUP_EXCEPT, - self.opc.SETUP_FINALLY] - - if self.version > 3.1: - setup_ops.append(self.opc.SETUP_WITH) - self.setup_ops = frozenset(setup_ops) - # Not really a set, but still clasification-like self.statement_opcode_sequences = [ (self.opc.POP_JUMP_IF_FALSE, self.opc.JUMP_FORWARD), @@ -857,7 +859,7 @@ class Scanner3(Scanner): self.not_continue.add(self.prev_op[i]) return self.prev_op[i] count_END_FINALLY += 1 - elif op in (self.opc.SETUP_EXCEPT, self.opc.SETUP_WITH, self.opc.SETUP_FINALLY): + elif op in self.setup_opts_no_loop: count_SETUP_ += 1 def rem_or(self, start, end, instr, target=None, include_beyond_target=False):