Author: Ronan Lamy <[email protected]>
Branch: less-stringly-ops
Changeset: r68224:ec91da17a267
Date: 2013-10-31 18:40 +0000
http://bitbucket.org/pypy/pypy/changeset/ec91da17a267/
Log: Turn ArgsFT.keywords into a dict
diff --git a/rpython/annotator/argument.py b/rpython/annotator/argument.py
--- a/rpython/annotator/argument.py
+++ b/rpython/annotator/argument.py
@@ -5,14 +5,13 @@
class ArgumentsForTranslation(object):
w_starstararg = None
- def __init__(self, args_w, keywords=None, keywords_w=None,
+ def __init__(self, args_w, keywords=None,
w_stararg=None, w_starstararg=None):
self.w_stararg = w_stararg
assert w_starstararg is None
assert isinstance(args_w, list)
self.arguments_w = args_w
- self.keywords = keywords or []
- self.keywords_w = keywords_w or []
+ self.keywords = keywords or {}
def __repr__(self):
""" NOT_RPYTHON """
@@ -20,8 +19,7 @@
if not self.keywords:
return '%s(%s)' % (name, self.arguments_w,)
else:
- return '%s(%s, %s, %s)' % (name, self.arguments_w,
- self.keywords, self.keywords_w)
+ return '%s(%s, %s)' % (name, self.arguments_w, self.keywords)
@property
def positional_args(self):
@@ -52,12 +50,12 @@
def prepend(self, w_firstarg): # used often
"Return a new Arguments with a new argument inserted first."
return ArgumentsForTranslation([w_firstarg] + self.arguments_w,
- self.keywords, self.keywords_w,
self.w_stararg,
+ self.keywords, self.w_stararg,
self.w_starstararg)
def copy(self):
return ArgumentsForTranslation(self.arguments_w, self.keywords,
- self.keywords_w, self.w_stararg, self.w_starstararg)
+ self.w_stararg, self.w_starstararg)
def _match_signature(self, scope_w, signature, defaults_w=None):
"""Parse args and kwargs according to the signature of a code object,
@@ -92,18 +90,17 @@
# handle keyword arguments
num_remainingkwds = 0
- keywords_w = self.keywords_w
kwds_mapping = None
if num_kwds:
# kwds_mapping maps target indexes in the scope (minus
input_argcount)
- # to positions in the keywords_w list
- kwds_mapping = [-1] * (co_argcount - input_argcount)
+ # to keyword names
+ kwds_mapping = []
# match the keywords given at the call site to the argument names
# the called function takes
# this function must not take a scope_w, to make the scope not
# escape
num_remainingkwds = len(keywords)
- for i, name in enumerate(keywords):
+ for name in keywords:
j = signature.find_argname(name)
# if j == -1 nothing happens
if j < input_argcount:
@@ -111,7 +108,7 @@
if j >= 0:
raise ArgErrMultipleValues(name)
else:
- kwds_mapping[j - input_argcount] = i # map to the right
index
+ kwds_mapping.append(name)
num_remainingkwds -= 1
if num_remainingkwds:
@@ -126,14 +123,11 @@
if input_argcount < co_argcount:
def_first = co_argcount - (0 if defaults_w is None else
len(defaults_w))
j = 0
- kwds_index = -1
for i in range(input_argcount, co_argcount):
- if kwds_mapping is not None:
- kwds_index = kwds_mapping[j]
- j += 1
- if kwds_index >= 0:
- scope_w[i] = keywords_w[kwds_index]
- continue
+ name = signature.argnames[i]
+ if name in keywords:
+ scope_w[i] = keywords[name]
+ continue
defnum = i - def_first
if defnum >= 0:
scope_w[i] = defaults_w[defnum]
@@ -144,8 +138,7 @@
def unpack(self):
"Return a ([w1,w2...], {'kw':w3...}) pair."
- kwds_w = dict(zip(self.keywords, self.keywords_w))
- return self.positional_args, kwds_w
+ return self.positional_args, self.keywords
def match_signature(self, signature, defaults_w):
"""Parse args and kwargs according to the signature of a code object,
@@ -169,7 +162,7 @@
args_w = data_w[:cnt] + stararg_w
assert len(args_w) == need_cnt
assert not self.keywords
- return ArgumentsForTranslation(args_w, [], [])
+ return ArgumentsForTranslation(args_w, {})
else:
data_w = data_w[:-1]
assert len(data_w) == cnt
@@ -177,7 +170,7 @@
args_w = data_w[:need_cnt]
_kwds_w = dict(zip(argnames[need_cnt:], data_w[need_cnt:]))
keywords_w = [_kwds_w[key] for key in self.keywords]
- return ArgumentsForTranslation(args_w, self.keywords, keywords_w)
+ return ArgumentsForTranslation(args_w, dict(zip(self.keywords,
keywords_w)))
@classmethod
def fromshape(cls, (shape_cnt, shape_keys, shape_star, shape_stst),
data_w):
@@ -193,14 +186,13 @@
p += 1
else:
w_starstar = None
- return cls(args_w, list(shape_keys), data_w[shape_cnt:end_keys],
+ return cls(args_w, dict(zip(shape_keys, data_w[shape_cnt:end_keys])),
w_star, w_starstar)
def flatten(self):
""" Argument <-> list of w_objects together with "shape" information
"""
shape_cnt, shape_keys, shape_star, shape_stst = self._rawshape()
- data_w = self.arguments_w + [self.keywords_w[self.keywords.index(key)]
- for key in shape_keys]
+ data_w = self.arguments_w + [self.keywords[key] for key in shape_keys]
if shape_star:
data_w.append(self.w_stararg)
if shape_stst:
diff --git a/rpython/annotator/test/test_argument.py
b/rpython/annotator/test/test_argument.py
--- a/rpython/annotator/test/test_argument.py
+++ b/rpython/annotator/test/test_argument.py
@@ -11,11 +11,6 @@
return list(it)
-def make_arguments_for_translation(args_w, keywords_w={}, w_stararg=None,
- w_starstararg=None):
- return MockArgs(args_w, keywords_w.keys(), keywords_w.values(),
- w_stararg, w_starstararg)
-
class TestArgumentsForTranslation(object):
def test_prepend(self):
@@ -24,10 +19,9 @@
assert args1 is not args
assert args1.arguments_w == ["thingy", "0"]
assert args1.keywords == args.keywords
- assert args1.keywords_w == args.keywords_w
def test_fixedunpacked(self):
- args = MockArgs([], ["k"], [1])
+ args = MockArgs([], {"k": 1})
py.test.raises(ValueError, args.fixedunpack, 1)
args = MockArgs(["a", "b"])
@@ -39,85 +33,84 @@
assert args.fixedunpack(2) == ['a', 'b']
def test_unmatch_signature(self):
- args = make_arguments_for_translation([1, 2, 3])
+ args = MockArgs([1, 2, 3])
sig = Signature(['a', 'b', 'c'], None, None)
data = args.match_signature(sig, [])
new_args = args.unmatch_signature(sig, data)
assert args.unpack() == new_args.unpack()
- args = make_arguments_for_translation([1])
+ args = MockArgs([1])
sig = Signature(['a', 'b', 'c'], None, None)
data = args.match_signature(sig, [2, 3])
new_args = args.unmatch_signature(sig, data)
assert args.unpack() == new_args.unpack()
- args = make_arguments_for_translation([1, 2, 3, 4, 5])
+ args = MockArgs([1, 2, 3, 4, 5])
sig = Signature(['a', 'b', 'c'], 'r', None)
data = args.match_signature(sig, [])
new_args = args.unmatch_signature(sig, data)
assert args.unpack() == new_args.unpack()
- args = make_arguments_for_translation([1], {'c': 3, 'b': 2})
+ args = MockArgs([1], {'c': 3, 'b': 2})
sig = Signature(['a', 'b', 'c'], None, None)
data = args.match_signature(sig, [])
new_args = args.unmatch_signature(sig, data)
assert args.unpack() == new_args.unpack()
- args = make_arguments_for_translation([1], {'c': 5})
+ args = MockArgs([1], {'c': 5})
sig = Signature(['a', 'b', 'c'], None, None)
data = args.match_signature(sig, [2, 3])
new_args = args.unmatch_signature(sig, data)
assert args.unpack() == new_args.unpack()
def test_rawshape(self):
- args = make_arguments_for_translation([1, 2, 3])
+ args = MockArgs([1, 2, 3])
assert rawshape(args) == (3, (), False, False)
- args = make_arguments_for_translation([1])
+ args = MockArgs([1])
assert rawshape(args, 2) == (3, (), False, False)
- args = make_arguments_for_translation([1, 2, 3, 4, 5])
+ args = MockArgs([1, 2, 3, 4, 5])
assert rawshape(args) == (5, (), False, False)
- args = make_arguments_for_translation([1], {'c': 3, 'b': 2})
+ args = MockArgs([1], {'c': 3, 'b': 2})
assert rawshape(args) == (1, ('b', 'c'), False, False)
- args = make_arguments_for_translation([1], {'c': 5})
+ args = MockArgs([1], {'c': 5})
assert rawshape(args) == (1, ('c', ), False, False)
- args = make_arguments_for_translation([1], {'c': 5, 'd': 7})
+ args = MockArgs([1], {'c': 5, 'd': 7})
assert rawshape(args) == (1, ('c', 'd'), False, False)
- args = make_arguments_for_translation([1, 2, 3, 4, 5], {'e': 5, 'd':
7})
+ args = MockArgs([1, 2, 3, 4, 5], {'e': 5, 'd': 7})
assert rawshape(args) == (5, ('d', 'e'), False, False)
def test_flatten(self):
- args = make_arguments_for_translation([1, 2, 3])
+ args = MockArgs([1, 2, 3])
assert args.flatten() == ((3, (), False, False), [1, 2, 3])
- args = make_arguments_for_translation([1])
+ args = MockArgs([1])
assert args.flatten() == ((1, (), False, False), [1])
- args = make_arguments_for_translation([1, 2, 3, 4, 5])
+ args = MockArgs([1, 2, 3, 4, 5])
assert args.flatten() == ((5, (), False, False), [1, 2, 3, 4, 5])
- args = make_arguments_for_translation([1], {'c': 3, 'b': 2})
+ args = MockArgs([1], {'c': 3, 'b': 2})
assert args.flatten() == ((1, ('b', 'c'), False, False), [1, 2, 3])
- args = make_arguments_for_translation([1], {'c': 5})
+ args = MockArgs([1], {'c': 5})
assert args.flatten() == ((1, ('c', ), False, False), [1, 5])
- args = make_arguments_for_translation([1], {'c': 5, 'd': 7})
+ args = MockArgs([1], {'c': 5, 'd': 7})
assert args.flatten() == ((1, ('c', 'd'), False, False), [1, 5, 7])
- args = make_arguments_for_translation([1, 2, 3, 4, 5], {'e': 5, 'd':
7})
+ args = MockArgs([1, 2, 3, 4, 5], {'e': 5, 'd': 7})
assert args.flatten() == ((5, ('d', 'e'), False, False), [1, 2, 3, 4,
5, 7, 5])
def test_stararg_flowspace_variable(self):
var = object()
shape = ((2, ('g', ), True, False), [1, 2, 9, var])
- args = make_arguments_for_translation([1, 2], {'g': 9},
- w_stararg=var)
+ args = MockArgs([1, 2], {'g': 9}, w_stararg=var)
assert args.flatten() == shape
args = MockArgs.fromshape(*shape)
diff --git a/rpython/rtyper/rbuiltin.py b/rpython/rtyper/rbuiltin.py
--- a/rpython/rtyper/rbuiltin.py
+++ b/rpython/rtyper/rbuiltin.py
@@ -74,10 +74,8 @@
raise TyperError("kwds args not supported")
# prefix keyword arguments with 'i_'
kwds_i = {}
- for i, key in enumerate(keywords):
- index = arguments.keywords_w[i]
- kwds_i['i_' + key] = index
-
+ for key in keywords:
+ kwds_i['i_' + key] = keywords[key]
return hop, kwds_i
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit