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 # to unpack star arguments
def sum(a, b, c, d): def sum(a, b, c, d):
return 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)
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, *args)
# sum(a, b, *args)
# FIXME: this is handled incorrectly # FIXME: this is handled incorrectly
# (*c,) = (3,4) # (*c,) = (3,4)

View File

@@ -495,13 +495,14 @@ class Python3Parser(PythonParser):
('pos_arg ' * args_pos) + ('pos_arg ' * args_pos) +
('kwarg ' * args_kw) + kw + token.kind) ('kwarg ' * args_kw) + kw + token.kind)
self.add_unique_rule(rule, token.kind, uniq_param, customize) self.add_unique_rule(rule, token.kind, uniq_param, customize)
else:
rule = ('call ::= expr ' + rule = ('call ::= expr ' +
('pos_arg ' * args_pos) + ('pos_arg ' * args_pos) +
('kwarg ' * args_kw) + ('kwarg ' * args_kw) +
'expr ' * nak + token.kind) '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: if self.version >= 3.5 and seen_GET_AWAITABLE_YIELD_FROM:
rule = ('async_call ::= expr ' + rule = ('async_call ::= expr ' +
('pos_arg ' * args_pos) + ('pos_arg ' * args_pos) +

View File

@@ -284,21 +284,23 @@ def customize_for_version(self, is_pypy, version):
kwarg_pos += 1 kwarg_pos += 1
elif key.kind.startswith('CALL_FUNCTION_VAR'): elif key.kind.startswith('CALL_FUNCTION_VAR'):
nargs = node[-1].attr & 0xFF 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] args_node = node[-2]
if args_node == 'pos_arg': if args_node == 'pos_arg':
args_node = args_node[0] args_node = args_node[0]
if args_node == 'expr': if args_node == 'expr':
args_node = args_node[0] 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': if args_node == 'build_list_unpack':
template = ('*%P)', (0, len(args_node)-1, ', *', 100)) template = ('*%P)', (0, len(args_node)-1, ', *', 100))
self.template_engine(template, args_node) self.template_engine(template, args_node)
else: else:
self.write(')') template = ('*%c)', -2)
self.template_engine(template, node)
self.prune() self.prune()
self.default(node) self.default(node)