Author: Maciej Fijalkowski <[email protected]>
Branch: 
Changeset: r68279:ffd24a3a9c70
Date: 2013-11-22 12:59 +0100
http://bitbucket.org/pypy/pypy/changeset/ffd24a3a9c70/

Log:    fix the annotation of prebuilt ordereddict

diff --git a/rpython/annotator/bookkeeper.py b/rpython/annotator/bookkeeper.py
--- a/rpython/annotator/bookkeeper.py
+++ b/rpython/annotator/bookkeeper.py
@@ -371,15 +371,19 @@
                     listdef.generalize(self.immutablevalue(e, False))
                 result = SomeList(listdef)
         elif tp is dict or tp is r_dict or tp is SomeOrderedDict.knowntype:
+            if tp is SomeOrderedDict.knowntype:
+                cls = SomeOrderedDict
+            else:
+                cls = SomeDict
             if need_const:
                 key = Constant(x)
                 try:
                     return self.immutable_cache[key]
                 except KeyError:
-                    result = SomeDict(DictDef(self,
-                                              s_ImpossibleValue,
-                                              s_ImpossibleValue,
-                                              is_r_dict = tp is r_dict))
+                    result = cls(DictDef(self,
+                                         s_ImpossibleValue,
+                                         s_ImpossibleValue,
+                                         is_r_dict = tp is r_dict))
                     self.immutable_cache[key] = result
                     if tp is r_dict:
                         s_eqfn = self.immutablevalue(x.key_eq)
@@ -412,10 +416,7 @@
                     dictdef.generalize_key(self.immutablevalue(ek, False))
                     dictdef.generalize_value(self.immutablevalue(ev, False))
                     dictdef.seen_prebuilt_key(ek)
-                if tp is SomeOrderedDict.knowntype:
-                    result = SomeOrderedDict(dictdef)
-                else:
-                    result = SomeDict(dictdef)
+                result = cls(dictdef)
         elif tp is weakref.ReferenceType:
             x1 = x()
             if x1 is None:
diff --git a/rpython/annotator/test/test_annrpython.py 
b/rpython/annotator/test/test_annrpython.py
--- a/rpython/annotator/test/test_annrpython.py
+++ b/rpython/annotator/test/test_annrpython.py
@@ -4148,6 +4148,19 @@
             a.build_types(f, [str, str])
         assert ("format() is not RPython" in exc.value.msg)
 
+    def test_prebuilt_ordered_dict(self):
+        try:
+            from collections import OrderedDict
+        except ImportError:
+            py.test.skip("Please upgrade to python 2.7")
+        d = OrderedDict([("aa", 1)])
+
+        def f():
+            return d
+
+        a = self.RPythonAnnotator()
+        assert isinstance(a.build_types(f, []), annmodel.SomeOrderedDict)
+
 
 def g(n):
     return [0, 1, 2, n]
diff --git a/rpython/translator/c/test/test_genc.py 
b/rpython/translator/c/test/test_genc.py
--- a/rpython/translator/c/test/test_genc.py
+++ b/rpython/translator/c/test/test_genc.py
@@ -574,6 +574,22 @@
     fn = compile(chooser, [bool])
     assert fn(True)
 
+def test_ordered_dict():
+    try:
+        from collections import OrderedDict
+    except ImportError:
+        py.test.skip("Please update to Python 2.7")
+
+    expected = [('ea', 1), ('bb', 2), ('c', 3), ('d', 4), ('e', 5),
+                ('ef', 6)]
+    d = OrderedDict(expected)
+
+    def f():
+        assert d.items() == expected
+
+    fn = compile(f, [])
+    fn()
+
 def test_inhibit_tail_call():
     def foobar_fn(n):
         return 42
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to