parser: make buildargsdict() precompute position where keyword args start
authorYuya Nishihara <yuya@tcha.org>
Mon, 09 Jan 2017 15:15:21 +0900
changeset 30752 ffd324eaf994
parent 30751 e882c7bb5a0b
child 30753 c3a3896a9fa8
parser: make buildargsdict() precompute position where keyword args start This prepares for adding *varargs support. See the next patch.
mercurial/parser.py
--- a/mercurial/parser.py	Wed Jan 11 07:40:52 2017 +0800
+++ b/mercurial/parser.py	Mon Jan 09 15:15:21 2017 +0900
@@ -96,17 +96,18 @@
     Invalid keywords or too many positional arguments are rejected, but
     missing arguments are just omitted.
     """
+    kwstart = next((i for i, x in enumerate(trees) if x[0] == keyvaluenode),
+                   len(trees))
     if len(trees) > len(keys):
         raise error.ParseError(_("%(func)s takes at most %(nargs)d arguments")
                                % {'func': funcname, 'nargs': len(keys)})
     args = {}
     # consume positional arguments
-    for k, x in zip(keys, trees):
-        if x[0] == keyvaluenode:
-            break
+    for k, x in zip(keys, trees[:kwstart]):
         args[k] = x
+    assert len(args) == kwstart
     # remainder should be keyword arguments
-    for x in trees[len(args):]:
+    for x in trees[kwstart:]:
         if x[0] != keyvaluenode or x[1][0] != keynode:
             raise error.ParseError(_("%(func)s got an invalid argument")
                                    % {'func': funcname})