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