[pypy-svn] r25349 - in pypy/dist/pypy/rpython/ootypesystem: . test

nik at codespeak.net nik at codespeak.net
Wed Apr 5 12:33:35 CEST 2006


Author: nik
Date: Wed Apr  5 12:33:33 2006
New Revision: 25349

Modified:
   pypy/dist/pypy/rpython/ootypesystem/ootype.py
   pypy/dist/pypy/rpython/ootypesystem/rlist.py
   pypy/dist/pypy/rpython/ootypesystem/test/test_oolist.py
   pypy/dist/pypy/rpython/ootypesystem/test/test_oortype.py
Log:
don't cache list types for the reprs, instead define sensible eq/hash
behaviour. suggestion by samuele, also necessary for recursive list
types which are about to be introduced.


Modified: pypy/dist/pypy/rpython/ootypesystem/ootype.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/ootype.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/ootype.py	Wed Apr  5 12:33:33 2006
@@ -189,6 +189,17 @@
     def __str__(self):
         return '%s(%s)' % (self.__class__.__name__, self._ITEMTYPE)
 
+    def __eq__(self, other):
+        if not isinstance(other, List):
+            return False
+        return self._ITEMTYPE == other._ITEMTYPE
+
+    def __ne__(self, other):
+        return not (self == other)
+
+    def __hash__(self):
+        return hash(self._ITEMTYPE)
+
     def _lookup(self, meth_name):
         METH = self._METHODS.get(meth_name)
         meth = None

Modified: pypy/dist/pypy/rpython/ootypesystem/rlist.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/rlist.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/rlist.py	Wed Apr  5 12:33:33 2006
@@ -16,7 +16,7 @@
             assert callable(item_repr)
             self._item_repr_computer = item_repr
         else:
-            self.lowleveltype = list_type(item_repr)
+            self.lowleveltype = ootype.List(item_repr.lowleveltype)
             self.external_item_repr, self.item_repr = \
                     externalvsinternal(rtyper, item_repr)
         self.listitem = listitem
@@ -27,7 +27,7 @@
         if 'item_repr' not in self.__dict__:
             self.external_item_repr, self.item_repr = \
                     externalvsinternal(self.rtyper, self._item_repr_computer())
-            self.lowleveltype = list_type(self.item_repr)
+            self.lowleveltype = ootype.List(self.item_repr.lowleveltype)
 
     def send_message(self, hop, message, can_raise=False):
         v_args = hop.inputargs(self, *hop.args_r[1:])
@@ -49,17 +49,6 @@
 ListRepr = BaseListRepr
 FixedSizeListRepr = BaseListRepr
 
-_list_types = {}
-
-def list_type(item_repr):
-    key = item_repr.lowleveltype
-    if _list_types.has_key(key):
-        return _list_types[key]
-    else:
-        LIST = ootype.List(key)
-        _list_types[key] = LIST
-        return LIST
-
 class __extend__(pairtype(BaseListRepr, IntegerRepr)):
 
     def rtype_getitem((r_list, r_int), hop):

Modified: pypy/dist/pypy/rpython/ootypesystem/test/test_oolist.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/test/test_oolist.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/test/test_oolist.py	Wed Apr  5 12:33:33 2006
@@ -37,6 +37,14 @@
     n = null(LT)
     py.test.raises(RuntimeError, "n.append(0)")
 
+def test_eq_hash():
+    LT1 = List(Signed)
+    LT2 = List(Signed)
+    LT3 = List(Unsigned)
+    assert LT1 == LT2
+    assert LT1 != LT3
+    assert hash(LT1) == hash(LT2)
+
 class TestInterpreted:
 
     def test_append_length(self):

Modified: pypy/dist/pypy/rpython/ootypesystem/test/test_oortype.py
==============================================================================
--- pypy/dist/pypy/rpython/ootypesystem/test/test_oortype.py	(original)
+++ pypy/dist/pypy/rpython/ootypesystem/test/test_oortype.py	Wed Apr  5 12:33:33 2006
@@ -155,7 +155,8 @@
     rtyper = t.buildrtyper()
     repr1 = ListRepr(rtyper, signed_repr)
     repr2 = ListRepr(rtyper, signed_repr)
-    assert repr1.lowleveltype is repr2.lowleveltype
+    assert repr1.lowleveltype == repr2.lowleveltype
+    assert hash(repr1.lowleveltype) == hash(repr2.lowleveltype)
 
 def test_list_annotation():
     LIST = List(Signed)



More information about the Pypy-commit mailing list