[pypy-commit] pypy virtual-arguments: restructure a bit more, and add comments what the various parts are doing
cfbolz
noreply at buildbot.pypy.org
Mon Apr 16 11:46:41 CEST 2012
Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: virtual-arguments
Changeset: r54401:a9c25d15ff4e
Date: 2012-04-14 12:10 +0200
http://bitbucket.org/pypy/pypy/changeset/a9c25d15ff4e/
Log: restructure a bit more, and add comments what the various parts are
doing
diff --git a/pypy/interpreter/argument.py b/pypy/interpreter/argument.py
--- a/pypy/interpreter/argument.py
+++ b/pypy/interpreter/argument.py
@@ -244,6 +244,7 @@
# that the length of the defaults_w does not vary too much.
co_argcount = signature.num_argnames() # expected formal arguments, without */**
+ # put the special w_firstarg into the scope, if it exists
if w_firstarg is not None:
upfront = 1
if co_argcount > 0:
@@ -261,9 +262,9 @@
num_kwds = len(keywords)
+ # put as many positional input arguments into place as available
input_argcount = upfront
if input_argcount < co_argcount:
- # put as many positional input arguments into place as available
take = min(num_args, co_argcount - upfront)
# letting the JIT unroll this loop is safe, because take is always
@@ -287,32 +288,37 @@
elif avail > co_argcount:
raise ArgErrCount(avail, num_kwds, signature, defaults_w, 0)
- # the code assumes that keywords can potentially be large, but that
- # argnames is typically not too large
+ # if a **kwargs argument is needed, create the dict
+ w_kwds = None
+ if signature.has_kwarg():
+ w_kwds = self.space.newdict(kwargs=True)
+ scope_w[co_argcount + signature.has_vararg()] = w_kwds
+
+ # handle keyword arguments
num_remainingkwds = 0
used_keywords = None
keywords_w = self.keywords_w
if num_kwds:
used_keywords = [False] * num_kwds
+ # match the keywords given at the call site to the argument names
+ # the called function takes
num_remainingkwds = _match_keywords(
signature, blindargs, input_argcount, keywords,
keywords_w, scope_w, used_keywords,
self._jit_few_keywords)
- if signature.has_kwarg():
- w_kwds = self.space.newdict(kwargs=True)
- # collect extra keyword arguments into the **kwarg
if num_remainingkwds:
- _collect_keyword_args(
- self.space, keywords, keywords_w, w_kwds,
- used_keywords, self.keyword_names_w, self._jit_few_keywords)
- #
- scope_w[co_argcount + signature.has_vararg()] = w_kwds
- elif num_remainingkwds:
- if co_argcount == 0:
- raise ArgErrCount(avail, num_kwds, signature, defaults_w, 0)
- raise ArgErrUnknownKwds(self.space, num_remainingkwds, keywords,
- used_keywords, self.keyword_names_w)
+ if w_kwds is not None:
+ # collect extra keyword arguments into the **kwarg
+ _collect_keyword_args(
+ self.space, keywords, keywords_w, w_kwds,
+ used_keywords, self.keyword_names_w, self._jit_few_keywords)
+ else:
+ if co_argcount == 0:
+ raise ArgErrCount(avail, num_kwds, signature, defaults_w, 0)
+ raise ArgErrUnknownKwds(self.space, num_remainingkwds, keywords,
+ used_keywords, self.keyword_names_w)
+ # check for missing arguments and fill them with defaults, if available
missing = 0
if input_argcount < co_argcount:
def_first = co_argcount - (0 if defaults_w is None else len(defaults_w))
@@ -323,9 +329,6 @@
if defnum >= 0:
scope_w[i] = defaults_w[defnum]
else:
- # error: not enough arguments. Don't signal it immediately
- # because it might be related to a problem with */** or
- # keyword arguments, which will be checked for below.
missing += 1
if missing:
raise ArgErrCount(avail, num_kwds, signature, defaults_w, missing)
More information about the pypy-commit
mailing list