# HG changeset patch # User Yuya Nishihara # Date 2017-01-09 06:15:21 # Node ID ffd324eaf9944032a4e3670856b356dced76712f # Parent e882c7bb5a0ba2589a44108c9a87b300a13e08df parser: make buildargsdict() precompute position where keyword args start This prepares for adding *varargs support. See the next patch. diff --git a/mercurial/parser.py b/mercurial/parser.py --- a/mercurial/parser.py +++ b/mercurial/parser.py @@ -96,17 +96,18 @@ def buildargsdict(trees, funcname, keys, 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})