diff --git a/test/bytecode_3.5/01_map_unpack.pyc b/test/bytecode_3.5/01_map_unpack.pyc deleted file mode 100644 index 4350096d..00000000 Binary files a/test/bytecode_3.5/01_map_unpack.pyc and /dev/null differ diff --git a/test/bytecode_3.5_run/01_map_unpack.pyc b/test/bytecode_3.5_run/01_map_unpack.pyc new file mode 100644 index 00000000..57350dc9 Binary files /dev/null and b/test/bytecode_3.5_run/01_map_unpack.pyc differ diff --git a/test/simple_source/bug35/01_map_unpack.py b/test/simple_source/bug35/01_map_unpack.py index 9107e116..33d44ca1 100644 --- a/test/simple_source/bug35/01_map_unpack.py +++ b/test/simple_source/bug35/01_map_unpack.py @@ -1,9 +1,19 @@ # Python 3.5+ PEP 448 - Additional Unpacking Generalizations for dictionaries -{**{}} -{**{'a': 1, 'b': 2}} -## {**{'x': 1}, **{'y': 2}} +# RUNNABLE! +b = {**{}} +assert b == {} +c = {**{'a': 1, 'b': 2}} +assert c == {'a': 1, 'b': 2} +d = {**{'x': 1}, **{'y': 2}} +assert d == {'x': 1, 'y': 2} # {'c': 1, {'d': 2}, **{'e': 3}} [*[]] -{**{0:0 for a in b}} -## {**{}, **{}} -## {**{}, **{}, **{}} + +assert {0: 0} == {**{0:0 for a in c}} + +# FIXME: assert deparsing is incorrect for: +# {**{}, **{}} +# assert {} == {**{}, **{}, **{}} + +# {**{}, **{}, **{}} +# assert {} == {**{}, **{}, **{}} diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index ad785cfd..42496f8a 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -1696,7 +1696,8 @@ class SourceWalker(GenericASTTraversal, object): self.indent_more(INDENT_PER_LEVEL) sep = INDENT_PER_LEVEL[:-1] - self.write('{') + if node[0] != 'dict_entry': + self.write('{') line_number = self.line_number if self.version >= 3.0 and not self.is_pypy: @@ -1778,7 +1779,13 @@ class SourceWalker(GenericASTTraversal, object): if sep.startswith(",\n"): self.write(sep[1:]) pass - elif node[-1].kind.startswith('BUILD_MAP_UNPACK'): + elif node[0].kind.startswith('dict_entry'): + assert self.version >= 3.5 + template = ("%C", (0, len(node[0]), ", **")) + self.template_engine(template, node[0]) + sep = '' + elif (node[-1].kind.startswith('BUILD_MAP_UNPACK') + or node[-1].kind.startswith('dict_entry')): assert self.version >= 3.5 # FIXME: I think we can intermingle dict_comp's with other # dictionary kinds of things. The most common though is @@ -1852,7 +1859,8 @@ class SourceWalker(GenericASTTraversal, object): pass if sep.startswith(",\n"): self.write(sep[1:]) - self.write('}') + if node[0] != 'dict_entry': + self.write('}') self.indent_less(INDENT_PER_LEVEL) self.prec = p self.prune()