From 3d36c046388ef23023522ca6fd380bd66384b7ce Mon Sep 17 00:00:00 2001 From: Yuya Nishihara Date: Mon, 9 Jan 2017 15:15:21 +0900 Subject: [PATCH] parser: make buildargsdict() precompute position where keyword args start This prepares for adding *varargs support. See the next patch. --- mercurial/parser.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mercurial/parser.py b/mercurial/parser.py index 7ed107dbd3..88516609d7 100644 --- a/mercurial/parser.py +++ b/mercurial/parser.py @@ -96,17 +96,18 @@ def buildargsdict(trees, funcname, keys, keyvaluenode, keynode): 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})