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

Reply via email to