Skip to content
This repository was archived by the owner on Mar 23, 2023. It is now read-only.

Commit 940ae16

Browse files
committed
potential fix for #17
1 parent bda6df5 commit 940ae16

File tree

2 files changed

+36
-6
lines changed

2 files changed

+36
-6
lines changed

compiler/block.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -440,16 +440,29 @@ def __init__(self, node):
440440
BlockVisitor.__init__(self)
441441
self.is_generator = False
442442
node_args = node.args
443-
args = [a.arg for a in node_args.args]
443+
args = []
444+
for arg in node_args.args:
445+
if isinstance(arg, ast.Tuple):
446+
args.append([a.arg for a in arg.elts])
447+
else:
448+
args.append(arg.arg)
444449
if node_args.vararg:
445450
args.append(node_args.vararg.arg)
446451
if node_args.kwarg:
447452
args.append(node_args.kwarg.arg)
448453
for i, name in enumerate(args):
449-
if name in self.vars:
450-
msg = "duplicate argument '{}' in function definition".format(name)
451-
raise util.ParseError(node, msg)
452-
self.vars[name] = Var(name, Var.TYPE_PARAM, arg_index=i)
454+
if isinstance(name, list):
455+
self.add_vars(i, 'τ'.join(name), node)
456+
for j, tuple_name in enumerate(name):
457+
self.vars[tuple_name] = Var(tuple_name, Var.TYPE_LOCAL)
458+
else:
459+
self.add_vars(i, name, node)
460+
461+
def add_vars(self, i, name, node):
462+
if name in self.vars:
463+
msg = "duplicate argument '{}' in function definition".format(name)
464+
raise util.ParseError(node, msg)
465+
self.vars[name] = Var(name, Var.TYPE_PARAM, arg_index=i)
453466

454467
def visit_Yield(self, unused_node): # pylint: disable=unused-argument
455468
self.is_generator = True

compiler/expr_visitor.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,19 @@ def visit_function_inline(self, node):
420420
# a separate pass so that we know whether to resolve a name as a local or a
421421
# global during the second pass.
422422
func_visitor = block.FunctionBlockVisitor(node)
423+
424+
for arg in reversed(node.args.args):
425+
if isinstance(arg, ast.Tuple):
426+
name = 'τ'.join(x.arg for x in arg.elts)
427+
from copy import deepcopy
428+
for j, elt in enumerate(reversed(arg.elts)):
429+
index = ast.Index(value=ast.Num(n=len(arg.elts) - j - 1, loc=arg.loc), loc=arg.loc)
430+
subscript = ast.Subscript(value=ast.Name(id=name, ctx=None, loc=arg.loc),
431+
slice=index, ctx=arg.ctx, loc=arg.loc)
432+
assign = ast.Assign(targets=[ast.Name(id=elt.arg, ctx=None, loc=arg.loc)],
433+
value=subscript, ctx=arg.ctx, loc=arg.loc)
434+
node.body.insert(0, assign)
435+
423436
for child in node.body:
424437
func_visitor.visit(child)
425438
func_block = block.FunctionBlock(self.block, node.name, func_visitor.vars,
@@ -443,9 +456,13 @@ def visit_function_inline(self, node):
443456
defaults = [None] * (argc - len(args.defaults)) + args.defaults
444457
for i, (a, d) in enumerate(zip(args.args, defaults)):
445458
with self.visit(d) if d else expr.nil_expr as default:
459+
if isinstance(a, ast.Tuple):
460+
name = util.go_str('τ'.join(x.arg for x in a.elts))
461+
else:
462+
name = util.go_str(a.arg)
446463
tmpl = '$args[$i] = πg.Param{Name: $name, Def: $default}'
447464
self.writer.write_tmpl(tmpl, args=func_args.expr, i=i,
448-
name=util.go_str(a.arg), default=default.expr)
465+
name=name, default=default.expr)
449466
flags = []
450467
if args.vararg:
451468
flags.append('πg.CodeFlagVarArg')

0 commit comments

Comments
 (0)