From 246495febd5a5b4cba5d8f547ba29a4887da59b7 Mon Sep 17 00:00:00 2001 From: rocky Date: Tue, 2 May 2017 21:55:41 -0400 Subject: [PATCH] Bang more on BUIlD_MAP_UNPACK there are still bugs. Note: {**{'x': 1}, **{'y': 2}} and {{'x': 1}, **{'y': 2}} generate the same Python 3.5+ bytecode. --- test/bytecode_3.5/01_map_unpack.pyc | Bin 343 -> 313 bytes test/simple_source/bug35/01_map_unpack.py | 2 +- uncompyle6/parser.py | 2 -- uncompyle6/parsers/parse3.py | 20 +++++++++++++------- uncompyle6/parsers/parse35.py | 7 ++++--- uncompyle6/semantics/pysource.py | 4 ++-- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/test/bytecode_3.5/01_map_unpack.pyc b/test/bytecode_3.5/01_map_unpack.pyc index 29102c9ca4627011abdba336d7b7b075ed8f8650..4350096d24c17723292efe5af1ec436923eb93aa 100644 GIT binary patch delta 203 zcmcc4w3De`jF*?I%z`uW1p@=aV<3hD79h(3h>IAJ5KqGE3CcR_=(#aqW2!J>& z6K7kou>l!HY!h!gT54ARKXD9p^x2mo`? B9-9CF delta 220 zcmdnVbe*YQjF*?IEsP`bAp--$V<3hD79h(3h>QJ!L?#2nG)4x-6b6PAMurq7h7@Lo zOeTmB3rHvvD9Q>JWn`Gf#K4%&z%Ui0o{b@eouP$+A(er_r5Pv%660V9*5tg!nD~+r zXfWR`#-x`_K*lY`id&486AL}qIDot&j*0snt+|0LKTXCWX0Qk= 3.5: if opname != 'BUILD_MAP_WITH_CALL': if opname == 'BUILD_MAP_UNPACK': - lhs = 'unmap_dict' + rule = kvlist_n + ' ::= ' + 'expr ' * (token.attr*2) + self.add_unique_rule(rule, opname, token.attr, customize) + rule = 'dict ::= ' + 'expr ' * (token.attr*2) + self.add_unique_rule(rule, opname, token.attr, customize) + rule = 'mapexpr ::= ' + 'dict ' * token.attr + self.add_unique_rule(rule, opname, token.attr, customize) + rule = ('unmap_dict ::= ' + + ('mapexpr ' * token.attr) + + ' BUILD_MAP_UNPACK') else: - lhs = kvlist_n - rule = lhs + ' ::= ' + 'expr ' * (token.attr*2) - self.add_unique_rule(rule, opname, token.attr, customize) - lhs = 'unmapexpr' if opname == 'BUILD_MAP_UNPACK' else' mapexpr' - rule = "%s ::= %s %s" % (lhs, kvlist_n, opname) + rule = kvlist_n + ' ::= ' + 'expr ' * (token.attr*2) + self.add_unique_rule(rule, opname, token.attr, customize) + rule = "mapexpr ::= %s %s" % (kvlist_n, opname) else: rule = kvlist_n + ' ::= ' + 'expr expr STORE_MAP ' * token.attr self.add_unique_rule(rule, opname, token.attr, customize) diff --git a/uncompyle6/parsers/parse35.py b/uncompyle6/parsers/parse35.py index 89187e01..b62e89cd 100644 --- a/uncompyle6/parsers/parse35.py +++ b/uncompyle6/parsers/parse35.py @@ -36,10 +36,11 @@ class Python35Parser(Python34Parser): expr ::= unmap_dict expr ::= unmapexpr - unmap_dict ::= mapexpr BUILD_MAP_UNPACK - unmap_dict ::= mapexpr unmap_dict + unmap_dict ::= dictcomp BUILD_MAP_UNPACK - build_list ::= expr BUILD_MAP_UNPACK + unmap_dict ::= kv_lists BUILD_MAP_UNPACK + kv_lists ::= kv_list kv_lists + kv_lists ::= kv_list # Python 3.5+ has WITH_CLEANUP_START/FINISH diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index 8b2fcb51..b97c61b8 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -345,7 +345,7 @@ class SourceWalker(GenericASTTraversal, object): '%|async with %c:\n%+%c%-', 0, 7), 'async_with_as_stmt': ( '%|async with %c as %c:\n%+%c%-', 0, 6, 7), - 'unmap_dict': ( '{**%c}', 0), + 'unmap_dict': ( '{**%C}', (0, -1, ', **') ), 'unmapexpr': ( '{**%c}', 0), }) @@ -1433,7 +1433,7 @@ class SourceWalker(GenericASTTraversal, object): i += 2 pass pass - elif node[1].type.startswith('kvlist'): + elif len(node) > 1 and node[1].type.startswith('kvlist'): # Python 3.0..3.4 style key/value list in mapexpr kv_node = node[1] l = list(kv_node)