[pypy-svn] r31354 - in pypy/dist/pypy/objspace/std: . test

benyoung at codespeak.net benyoung at codespeak.net
Thu Aug 17 09:23:58 CEST 2006


Author: benyoung
Date: Thu Aug 17 09:23:43 2006
New Revision: 31354

Modified:
   pypy/dist/pypy/objspace/std/dictmultiobject.py
   pypy/dist/pypy/objspace/std/test/test_dictmultiobject.py
Log:
Some fixes for mwhs changes + more tests

Modified: pypy/dist/pypy/objspace/std/dictmultiobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/dictmultiobject.py	(original)
+++ pypy/dist/pypy/objspace/std/dictmultiobject.py	Thu Aug 17 09:23:43 2006
@@ -214,18 +214,18 @@
         return self.setitem_str(w_key, w_value)
     
     def setitem_str(self, w_key, w_value):
-        print w_key, w_value
-        if self.valid == 4:
-            return self._convert_to_sdict(w_key, w_value)
         entry = self._lookup(self.space.str_w(w_key))
         if entry.w_value is None:
+            if self.valid == 4:
+                return self._convert_to_sdict(w_key, w_value)
             self.valid += 1
         entry.w_value = w_value
         return self
 
     def delitem(self, w_key):
         space = self.space
-        if space.is_w(space.type(w_key), space.w_str):
+        w_key_type = space.type(w_key)
+        if space.is_w(w_key_type, space.w_str):
             entry = self._lookup(space.str_w(w_key))
             if entry.w_value is not None:
                 for i in range(self.entries.index(entry), self.valid):
@@ -238,7 +238,7 @@
                 return self
             else:
                 raise KeyError
-        elif self._is_sane_hash(space.type(w_key)):
+        elif self._is_sane_hash(w_key_type):
             raise KeyError
         else:
             return self._convert_to_rdict().delitem(w_key)
@@ -271,51 +271,12 @@
         return [(self.space.wrap(e.key), e.w_value)
                 for e in [self.entries[i] for i in range(self.valid)]]
 
-class RDictImplementation(DictImplementation):
-    def __init__(self, space):
-        self.space = space
-        self.content = r_dict(space.eq_w, space.hash_w)
-
-    def __repr__(self):
-        return "%s<%s>" % (self.__class__.__name__, self.content)
-        
-    def setitem(self, w_key, w_value):
-        self.content[w_key] = w_value
-        return self
-    setitem_str = setitem
-    def delitem(self, w_key):
-        del self.content[w_key]
-        if self.content:
-            return self
-        else:
-            return self.space.emptydictimpl
-        
-    def length(self):
-        return len(self.content)
-    def get(self, w_lookup):
-        return self.content.get(w_lookup, None)
-
-    def iteritems(self):
-        return self.content.iteritems()
-    def iterkeys(self):
-        return self.content.iterkeys()
-    def itervalues(self):
-        return self.content.itervalues()
-
-    def keys(self):
-        return self.content.keys()
-    def values(self):
-        return self.content.values()
-    def items(self):
-        return self.content.items()
-
 class StrDictImplementation(DictImplementation):
     def __init__(self, space, w_key, w_value):
         self.space = space
         self.content = {space.str_w(w_key): w_value}
         
     def setitem(self, w_key, w_value):
-        print 's', w_key, w_value
         space = self.space
         if space.is_w(space.type(w_key), space.w_str):
             self.content[space.str_w(w_key)] = w_value
@@ -329,13 +290,14 @@
 
     def delitem(self, w_key):
         space = self.space
-        if space.is_w(space.type(w_key), space.w_str):
+        w_key_type = space.type(w_key)
+        if space.is_w(w_key_type, space.w_str):
             del self.content[space.str_w(w_key)]
             if self.content:
                 return self
             else:
                 return space.emptydictimpl
-        elif self._is_sane_hash(space.type(w_key)):
+        elif self._is_sane_hash(w_key_type):
             raise KeyError
         else:
             return self._as_rdict().delitem(w_key)
@@ -389,6 +351,43 @@
             newimpl.setitem(self.space.wrap(k), w_v)
         return newimpl
 
+class RDictImplementation(DictImplementation):
+    def __init__(self, space):
+        self.space = space
+        self.content = r_dict(space.eq_w, space.hash_w)
+
+    def __repr__(self):
+        return "%s<%s>" % (self.__class__.__name__, self.content)
+        
+    def setitem(self, w_key, w_value):
+        self.content[w_key] = w_value
+        return self
+    setitem_str = setitem
+    def delitem(self, w_key):
+        del self.content[w_key]
+        if self.content:
+            return self
+        else:
+            return self.space.emptydictimpl
+        
+    def length(self):
+        return len(self.content)
+    def get(self, w_lookup):
+        return self.content.get(w_lookup, None)
+
+    def iteritems(self):
+        return self.content.iteritems()
+    def iterkeys(self):
+        return self.content.iterkeys()
+    def itervalues(self):
+        return self.content.itervalues()
+
+    def keys(self):
+        return self.content.keys()
+    def values(self):
+        return self.content.values()
+    def items(self):
+        return self.content.items()
 
 import time, py
 
@@ -482,7 +481,7 @@
         self.content[w_key] = w_value
         self.info.maxcontents = max(self.info.maxcontents, len(self.content))
         return self
-    def setitem(self, w_key, w_value):
+    def setitem_str(self, w_key, w_value):
         self.info.setitem_strs += 1
         return self.setitem(w_key, w_value)
     def delitem(self, w_key):
@@ -499,10 +498,10 @@
     def length(self):
         self.info.lengths += 1
         return len(self.content)
-    def get(self, w_lookup, w_default):
+    def get(self, w_lookup):
         self.info.gets += 1
         self._read(w_lookup)
-        return self.content.get(w_lookup, w_default)
+        return self.content.get(w_lookup, None)
 
     def iteritems(self):
         self.info.iteritems += 1

Modified: pypy/dist/pypy/objspace/std/test/test_dictmultiobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/test/test_dictmultiobject.py	(original)
+++ pypy/dist/pypy/objspace/std/test/test_dictmultiobject.py	Thu Aug 17 09:23:43 2006
@@ -2,7 +2,7 @@
 from pypy.objspace.std.dictmultiobject import \
      W_DictMultiObject, setitem__DictMulti_ANY_ANY, getitem__DictMulti_ANY, \
      EmptyDictImplementation, RDictImplementation, StrDictImplementation, \
-     SmallDictImplementation, SmallStrDictImplementation
+     SmallDictImplementation, SmallStrDictImplementation, MeasuringDictImplementation
 from pypy.conftest import gettestobjspace
 from pypy.objspace.std.test import test_dictobject
 
@@ -22,6 +22,9 @@
     def wrap(self, obj):
         return obj
 
+    def isinstance(self, obj, klass):
+        return isinstance(obj, klass)
+
 class TestDictImplementation:
     def setup_method(self,method):
         self.space = FakeSpace()
@@ -42,11 +45,13 @@
 
 class TestRDictImplementation:
     ImplementionClass = RDictImplementation
+    DevolvedClass = RDictImplementation
+    EmptyClass = EmptyDictImplementation
 
     def setup_method(self,method):
         self.space = FakeSpace()
-        self.space.emptydictimpl = EmptyDictImplementation(self.space)
         self.space.DictObjectCls = W_DictMultiObject
+        self.space.emptydictimpl = EmptyDictImplementation(self.space)
         self.string = self.space.str_w("fish")
         self.string2 = self.space.str_w("fish2")
         self.impl = self.get_impl()
@@ -64,7 +69,7 @@
         newimpl =  self.impl.delitem(self.string)
         assert newimpl is self.impl
         newimpl = self.impl.delitem(self.string2)
-        assert newimpl is self.space.emptydictimpl
+        assert isinstance(newimpl, self.EmptyClass)
 
     def test_keys(self):
         self.impl.setitem(self.string, 1000)
@@ -92,7 +97,7 @@
         for x in xrange(100):
             impl = impl.setitem(self.space.str_w(str(x)), x)
             impl = impl.setitem(x, x)
-        assert isinstance(impl, RDictImplementation)
+        assert isinstance(impl, self.DevolvedClass)
 
 class TestStrDictImplementation(TestRDictImplementation):
     ImplementionClass = StrDictImplementation
@@ -106,9 +111,13 @@
     def get_impl(self):
         return self.ImplementionClass(self.space, self.string, self.string2)
 
+class TestMeasuringDictImplementation(TestRDictImplementation):
+    ImplementionClass = MeasuringDictImplementation
+    DevolvedClass = MeasuringDictImplementation
+    EmptyClass = MeasuringDictImplementation
+
 class TestSmallStrDictImplementation(TestRDictImplementation):
     ImplementionClass = SmallStrDictImplementation
 
     def get_impl(self):
         return self.ImplementionClass(self.space, self.string, self.string2)
-



More information about the Pypy-commit mailing list