diff --git a/test/bytecode_3.5/03_double_star_unpack.pyc b/test/bytecode_3.5/03_double_star_unpack.pyc index 94544203..0b6ef44c 100644 Binary files a/test/bytecode_3.5/03_double_star_unpack.pyc and b/test/bytecode_3.5/03_double_star_unpack.pyc differ diff --git a/test/simple_source/bug35/03_double_star_unpack.py b/test/simple_source/bug35/03_double_star_unpack.py index 9901d371..407629b9 100644 --- a/test/simple_source/bug35/03_double_star_unpack.py +++ b/test/simple_source/bug35/03_double_star_unpack.py @@ -3,15 +3,14 @@ # to unpack star arguments def sum(a, b, c, d): return a + b + c + d -a, b, c = 1, 2, 3 -args = (1, 2) + +args, a, b, c = (1, 2), 1, 2, 3 sum(*args, *args) +sum(*args, *args, *args) -# FIXME: these is handled incorrectly - -# sum(a, *args, *args) - -# sum(a, b, *args) +sum(a, *args, *args) +sum(a, b, *args) +sum(a, b, *args, *args) # FIXME: this is handled incorrectly # (*c,) = (3,4) diff --git a/uncompyle6/parsers/parse3.py b/uncompyle6/parsers/parse3.py index 86f3bf8f..aceb4f1a 100644 --- a/uncompyle6/parsers/parse3.py +++ b/uncompyle6/parsers/parse3.py @@ -495,13 +495,14 @@ class Python3Parser(PythonParser): ('pos_arg ' * args_pos) + ('kwarg ' * args_kw) + kw + token.kind) self.add_unique_rule(rule, token.kind, uniq_param, customize) + else: + rule = ('call ::= expr ' + + ('pos_arg ' * args_pos) + + ('kwarg ' * args_kw) + + 'expr ' * nak + token.kind) - rule = ('call ::= expr ' + - ('pos_arg ' * args_pos) + - ('kwarg ' * args_kw) + - 'expr ' * nak + token.kind) + self.add_unique_rule(rule, token.kind, uniq_param, customize) - self.add_unique_rule(rule, token.kind, uniq_param, customize) if self.version >= 3.5 and seen_GET_AWAITABLE_YIELD_FROM: rule = ('async_call ::= expr ' + ('pos_arg ' * args_pos) + diff --git a/uncompyle6/semantics/customize.py b/uncompyle6/semantics/customize.py index 797e5648..7fdd499d 100644 --- a/uncompyle6/semantics/customize.py +++ b/uncompyle6/semantics/customize.py @@ -284,21 +284,23 @@ def customize_for_version(self, is_pypy, version): kwarg_pos += 1 elif key.kind.startswith('CALL_FUNCTION_VAR'): nargs = node[-1].attr & 0xFF + if nargs > 0: + template = ('%c(%C, ', 0, (1, nargs+1, ', ')) + else: + template = ('%c(', 0) + self.template_engine(template, node) + args_node = node[-2] if args_node == 'pos_arg': args_node = args_node[0] if args_node == 'expr': args_node = args_node[0] - if nargs > 0: - template = ('%c(%C, ', 0, (0, nargs, ', ')) - else: - template = ('%c(', 0) - self.template_engine(template, node) if args_node == 'build_list_unpack': template = ('*%P)', (0, len(args_node)-1, ', *', 100)) self.template_engine(template, args_node) else: - self.write(')') + template = ('*%c)', -2) + self.template_engine(template, node) self.prune() self.default(node)