Author: Raffael Tfirst <raffael.tfi...@gmail.com>
Branch: py3.5
Changeset: r85083:f4991e923ef5
Date: 2016-06-10 22:17 +0200
http://bitbucket.org/pypy/pypy/changeset/f4991e923ef5/

Log:    New AST handling in handle_call (not done, backup)

diff --git a/pypy/interpreter/astcompiler/astbuilder.py 
b/pypy/interpreter/astcompiler/astbuilder.py
--- a/pypy/interpreter/astcompiler/astbuilder.py
+++ b/pypy/interpreter/astcompiler/astbuilder.py
@@ -553,7 +553,6 @@
                 break
             if arg_type == tokens.DOUBLESTAR:
                 break
-            #TODO: scan further
             if arg_type == syms.vfpdef or arg_type == syms.tfpdef:
                 n_pos += 1
             if arg_type == tokens.EQUAL:
@@ -1016,11 +1015,11 @@
             return ast.Subscript(left_expr, ast.Index(tup), ast.Load,
                                  middle.get_lineno(), middle.get_column())
 
-    #fix this method
     def handle_call(self, args_node, callable_expr):
-        arg_count = 0
-        keyword_count = 0
-        generator_count = 0
+        arg_count = 0 # position args + iterable args unpackings
+        keyword_count = 0 # keyword args + keyword args unpackings
+        doublestars_count = 0 # just keyword argument unpackings
+        generator_count = 0 
         for i in range(args_node.num_children()):
             argument = args_node.get_child(i)
             if argument.type == syms.argument:
@@ -1028,7 +1027,11 @@
                     arg_count += 1
                 elif argument.get_child(1).type == syms.comp_for:
                     generator_count += 1
+                elif argument.get_child(0).type == tokens.STAR:
+                    arg_count += 1
                 else:
+                    # argument.get_child(0).type == tokens.DOUBLESTAR
+                    # or keyword arg
                     keyword_count += 1
         if generator_count > 1 or \
                 (generator_count and (keyword_count or arg_count)):
@@ -1039,22 +1042,27 @@
         args = []
         keywords = []
         used_keywords = {}
-        variable_arg = None
-        keywords_arg = None
         child_count = args_node.num_children()
         i = 0
         while i < child_count:
             argument = args_node.get_child(i)
             if argument.type == syms.argument:
+                expr_node = argument.get_child(0)
                 if argument.num_children() == 1:
-                    expr_node = argument.get_child(0)
+                    # a positional argument
                     if keywords:
-                        self.error("non-keyword arg after keyword arg",
-                                   expr_node)
-                    if variable_arg:
-                        self.error("only named arguments may follow "
-                                   "*expression", expr_node)
+                        if doublestars_count:
+                            self.error("positional argument follows "
+                                       "keyword argument unpacking",
+                                       expr_node)
+                        else
+                            self.error("positional argument follows "
+                                       "keyword argument",
+                                       expr_node)
                     args.append(self.handle_expr(expr_node))
+                elif expr_node.type == tokens.STAR
+                    # an iterable argument unpacking
+                    # continue here
                 elif argument.get_child(1).type == syms.comp_for:
                     args.append(self.handle_genexp(argument))
                 else:
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to