Fix Python 3.5 CALL_FUNCTION_VAR handling

This commit is contained in:
rocky
2018-02-12 03:07:03 -05:00
parent 6d29ed9077
commit 230a38d537
4 changed files with 20 additions and 18 deletions

View File

@@ -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)

View File

@@ -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) +

View File

@@ -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)