From 230a38d537fe99a18a98e20c341219bd92531be4 Mon Sep 17 00:00:00 2001 From: rocky Date: Mon, 12 Feb 2018 03:07:03 -0500 Subject: [PATCH] Fix Python 3.5 CALL_FUNCTION_VAR handling --- test/bytecode_3.5/03_double_star_unpack.pyc | Bin 349 -> 433 bytes .../bug35/03_double_star_unpack.py | 13 ++++++------- uncompyle6/parsers/parse3.py | 11 ++++++----- uncompyle6/semantics/customize.py | 14 ++++++++------ 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/test/bytecode_3.5/03_double_star_unpack.pyc b/test/bytecode_3.5/03_double_star_unpack.pyc index 945442033bf01711a647dae9916e123eb77777cd..0b6ef44c55f6c7ba96dfccd95d66e3daae74d48c 100644 GIT binary patch delta 251 zcmcc1w2`@9oR^pDgjZu!JtG6dV+JI^3S>I~ad91xNC6^7h86~fC?JEKA%=w^ijg6T zi6M%aA&P||m4P9Z5rn2PG4wDnFv9sDA!fJ`6Ot-Mh$<#|hE!&da1Rqy0Lq6N#xyZ> zk=;tBA`YM%ia3FUCQA`Fhz%Dg;sS}X7O?}VTP%r1>BU7%AO*}If(1xSHegg1-~lpt On1vVx7=@XHfg}Ku9wT)C delta 166 zcmdnUe3vOyjF*?|ZES5+B_jjFV+JI^3}ib1aj_|oNC6^7h86~fC?JE4A%>YDijg6T zi6M%aA%&eGiiIJSfgu%0vM@|#V(4L*IB$`qCUX%7P-hV*h~NSenoI}*P1YiIkT?^F e0NGT;0wiv+Bo?I?Pp)HB=3)bKd6@Va*%$#wBNz1m 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)