From 260ddedbfd57f4c731eff7687b58f4554399ade9 Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 22 Nov 2016 18:14:31 -0500 Subject: [PATCH] More detailed COME_FROMs For now we only add COME_FROM_FINALLY and COME_FROM_WITH and even here only on 2.7 --- uncompyle6/parsers/parse2.py | 4 ++-- uncompyle6/parsers/parse27.py | 8 ++++++-- uncompyle6/scanners/scanner2.py | 14 ++++++++------ 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/uncompyle6/parsers/parse2.py b/uncompyle6/parsers/parse2.py index e71ab46d..530c3585 100644 --- a/uncompyle6/parsers/parse2.py +++ b/uncompyle6/parsers/parse2.py @@ -9,7 +9,7 @@ e.g. 5, myvariable, "for", etc. they are CPython Bytecode tokens, e.g. "LOAD_CONST 5", "STORE NAME myvariable", "SETUP_LOOP", etc. If we succeed in creating a parse tree, then we have a Python program -that a later phase can tern into a sequence of ASCII text. +that a later phase can turn into a sequence of ASCII text. """ from __future__ import print_function @@ -336,7 +336,7 @@ class Python2Parser(PythonParser): # always be the case. self.add_unique_rules([ "stmt ::= tryfinallystmt_pypy", - "tryfinallystmt_pypy ::= SETUP_FINALLY suite_stmts_opt COME_FROM " + "tryfinallystmt_pypy ::= SETUP_FINALLY suite_stmts_opt COME_FROM_FINALLY " "suite_stmts_opt END_FINALLY" ], customize) continue diff --git a/uncompyle6/parsers/parse27.py b/uncompyle6/parsers/parse27.py index aa70b664..b5af38ab 100644 --- a/uncompyle6/parsers/parse27.py +++ b/uncompyle6/parsers/parse27.py @@ -31,6 +31,10 @@ class Python27Parser(Python2Parser): def p_try27(self, args): """ + tryfinallystmt ::= SETUP_FINALLY suite_stmts_opt + POP_BLOCK LOAD_CONST + COME_FROM_FINALLY suite_stmts_opt END_FINALLY + tryelsestmt ::= SETUP_EXCEPT suite_stmts_opt POP_BLOCK try_middle else_suite COME_FROM @@ -77,11 +81,11 @@ class Python27Parser(Python2Parser): assert2 ::= assert_expr jmp_true LOAD_ASSERT expr RAISE_VARARGS_2 withstmt ::= expr SETUP_WITH POP_TOP suite_stmts_opt - POP_BLOCK LOAD_CONST COME_FROM + POP_BLOCK LOAD_CONST COME_FROM_WITH WITH_CLEANUP END_FINALLY withasstmt ::= expr SETUP_WITH designator suite_stmts_opt - POP_BLOCK LOAD_CONST COME_FROM + POP_BLOCK LOAD_CONST COME_FROM_WITH WITH_CLEANUP END_FINALLY # Common with 2.6 diff --git a/uncompyle6/scanners/scanner2.py b/uncompyle6/scanners/scanner2.py index 877f5170..0ffb78ef 100644 --- a/uncompyle6/scanners/scanner2.py +++ b/uncompyle6/scanners/scanner2.py @@ -93,11 +93,6 @@ class Scanner2(scan.Scanner): for instr in bytecode.get_instructions(co): print(instr._disassemble()) - # from xdis.bytecode import Bytecode - # bytecode = Bytecode(co, self.opc) - # for instr in bytecode.get_instructions(co): - # print(instr._disassemble()) - # Container for tokens tokens = [] @@ -166,8 +161,15 @@ class Scanner2(scan.Scanner): # properly. For example, a "loop" with an "if" nested in it should have the # "loop" tag last so the grammar rule matches that properly. for jump_offset in sorted(jump_targets[offset], reverse=True): + come_from_name = 'COME_FROM' + opname = self.opc.opname[self.code[jump_offset]] + if opname.startswith('SETUP_') and self.version == 2.7: + come_from_type = opname[len('SETUP_'):] + if come_from_type not in ('LOOP', 'EXCEPT'): + come_from_name = 'COME_FROM_%s' % come_from_type + pass tokens.append(Token( - 'COME_FROM', None, repr(jump_offset), + come_from_name, None, repr(jump_offset), offset="%s_%d" % (offset, jump_idx), has_arg = True)) jump_idx += 1