[pypy-svn] r25693 - pypy/dist/pypy/objspace/std

stephan at codespeak.net stephan at codespeak.net
Tue Apr 11 12:07:02 CEST 2006


Author: stephan
Date: Tue Apr 11 12:07:01 2006
New Revision: 25693

Modified:
   pypy/dist/pypy/objspace/std/frozensettype.py
   pypy/dist/pypy/objspace/std/setobject.py
Log:
all tests from lib-python/modified-2.4.1/test/test_set.py are passing now, but
tests for deepcopy and pickle. (Haven't checked compilability yet)


Modified: pypy/dist/pypy/objspace/std/frozensettype.py
==============================================================================
--- pypy/dist/pypy/objspace/std/frozensettype.py	(original)
+++ pypy/dist/pypy/objspace/std/frozensettype.py	Tue Apr 11 12:07:01 2006
@@ -18,8 +18,11 @@
 
 def descr__frozenset__new__(space, w_frozensettype, w_iterable=NoneNotWrapped):
     from pypy.objspace.std.setobject import W_FrozensetObject
+    from pypy.objspace.std.setobject import _is_frozenset_exact
     if w_iterable is None:
         w_iterable = space.newtuple([])
+    if _is_frozenset_exact(space, w_iterable):
+        return w_iterable
     w_obj = space.allocate_instance(W_FrozensetObject, w_frozensettype)
     W_FrozensetObject.__init__(w_obj, space, w_iterable)
 

Modified: pypy/dist/pypy/objspace/std/setobject.py
==============================================================================
--- pypy/dist/pypy/objspace/std/setobject.py	(original)
+++ pypy/dist/pypy/objspace/std/setobject.py	Tue Apr 11 12:07:01 2006
@@ -11,16 +11,16 @@
     def __init__(w_self, space, wrappeditems=None):
         W_Object.__init__(w_self, space)
         w_self.setdata = setdata = r_dict(space.eq_w, space.hash_w)
-        if wrappeditems is not None:
-            iterable_w = space.unpackiterable(wrappeditems)
-            for w_item in iterable_w:
-                w_self.setdata[w_item] = None
+        _initialize_set(space, w_self, wrappeditems)
 
     def __repr__(w_self):
         """representation for debugging purposes"""
         reprlist = [repr(w_item) for w_item in w_self.setdata.keys()]
         return "<%s(%s)>" % (w_self.__class__.__name__, ', '.join(reprlist))
 
+    def _newobj(w_self, space):
+        return space.call(space.type(w_self),None)
+
 class W_SetObject(W_BaseSetObject):
     from pypy.objspace.std.settype import set_typedef as typedef
 
@@ -87,12 +87,18 @@
 
     return data
 
-def _dict_to_set(space, rpdict):
-    return space.newset(W_SetIterObject(space, rpdict))
-
-def _dict_to_frozenset(space, rpdict):
-    #return space.newfrozenset(space.newtuple(rpdict.keys()))
-    return space.newfrozenset(W_SetIterObject(space, rpdict))
+def _initialize_set(space, w_obj, wrappeditems=None):
+    w_obj.setdata.clear()
+    if wrappeditems is not None:
+        w_iterator = space.iter(wrappeditems)
+        while True:
+            try: 
+                w_item = space.next(w_iterator)
+            except OperationError, e:
+                if not e.match(space, space.w_StopIteration):
+                    raise
+                break
+            w_obj.setdata[w_item] = None
 
 # helper functions for set operation on dicts
 
@@ -103,6 +109,12 @@
     else:
         return False
 
+def _is_frozenset_exact(space, w_obj):
+    if space.eq_w(space.type(w_obj), space.w_frozenset):
+        return True
+    else:
+        return False
+
 def _union_dict(space, ldict, rdict, isupdate):
     if isupdate:
         ld = ldict
@@ -187,10 +199,15 @@
     return space.w_None
 
 def set_copy__Set(space, w_left):
-    return space.newset(w_left)
+    w_obj = w_left._newobj(space)
+    w_obj.setdata.update(w_left.setdata)
+    return w_obj
 
 def frozenset_copy__Frozenset(space, w_left):
-    return space.newfrozenset(w_left)
+    if _is_frozenset_exact(space, w_left):
+        return w_left
+    else:
+        return set_copy__Set(space,w_left)
 
 def set_clear__Set(space, w_left):
     w_left.setdata.clear()
@@ -199,18 +216,15 @@
 def set_difference__Set_ANY(space, w_left, w_other):
     ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
     new_ld, rd = _difference_dict(space, ld, rd, False)
-    return _dict_to_set(space, new_ld)
+    w_obj = w_left._newobj(space)
+    w_obj.setdata.update(new_ld)
+    return w_obj
 
 sub__Set_Set = set_difference__Set_ANY
 sub__Set_Frozenset = set_difference__Set_ANY
-
-def frozenset_difference__Frozenset_ANY(space, w_left, w_other):
-    ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
-    new_ld, rd = _difference_dict(space, ld, rd, False)
-    return _dict_to_frozenset(space, new_ld)
-
-sub__Frozenset_Set = frozenset_difference__Frozenset_ANY
-sub__Frozenset_Frozenset = frozenset_difference__Frozenset_ANY
+frozenset_difference__Frozenset_ANY = set_difference__Set_ANY
+sub__Frozenset_Set = set_difference__Set_ANY
+sub__Frozenset_Frozenset = set_difference__Set_ANY
 
 
 def set_difference_update__Set_ANY(space, w_left, w_other):
@@ -247,17 +261,18 @@
     except Exception, exp:
         if _is_setlike(space, w_other):
             w_f = space.newfrozenset(w_other)
-            return space.newbool(w_f)
+            r = w_f in w_left.setdata
+            return space.newbool(r)
         else:
-            return space.w_False
+            raise exp
 
 contains__Frozenset_ANY = contains__Set_ANY
 
-def set_issubset__Set_Set(space, w_left, w_other):
+def set_issubset__Set_ANY(space, w_left, w_other):
     if space.is_w(w_left, w_other):
         return space.w_True
 
-    ld, rd = w_left.setdata, w_other.setdata
+    ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
     if len(ld) > len(rd):
         return space.w_False
 
@@ -266,19 +281,17 @@
             return space.w_False
     return space.w_True
 
-set_issubset__Set_Frozenset = set_issubset__Set_Set
-frozenset_issubset__Frozenset_Set = set_issubset__Set_Set
-frozenset_issubset__Frozenset_Frozenset = set_issubset__Set_Set
-
-le__Set_Set = set_issubset__Set_Set
-le__Set_Frozenset = set_issubset__Set_Set
-le__Frozenset_Frozenset = set_issubset__Set_Set
+frozenset_issubset__Frozenset_ANY = set_issubset__Set_ANY
 
-def set_issuperset__Set_Set(space, w_left, w_other):
+le__Set_Set = set_issubset__Set_ANY
+le__Set_Frozenset = set_issubset__Set_ANY
+le__Frozenset_Frozenset = set_issubset__Set_ANY
+
+def set_issuperset__Set_ANY(space, w_left, w_other):
     if space.is_w(w_left, w_other):
         return space.w_True
 
-    ld, rd = w_left.setdata, w_other.setdata
+    ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
     if len(ld) < len(rd):
         return space.w_False
 
@@ -287,17 +300,23 @@
             return space.w_False
     return space.w_True
 
-set_issuperset__Set_Frozenset = set_issuperset__Set_Set
-frozenset_issuperset__Frozenset_Set = set_issuperset__Set_Set
-frozenset_issuperset__Frozenset_Frozenset = set_issuperset__Set_Set
-
-ge__Set_Set = set_issuperset__Set_Set
-ge__Set_Frozenset = set_issuperset__Set_Set
-ge__Frozenset_Frozenset = set_issuperset__Set_Set
+frozenset_issuperset__Frozenset_ANY = set_issuperset__Set_ANY
+
+ge__Set_Set = set_issuperset__Set_ANY
+ge__Set_Frozenset = set_issuperset__Set_ANY
+ge__Frozenset_Frozenset = set_issuperset__Set_ANY
 
 def set_discard__Set_ANY(space, w_left, w_item):
-    if w_item in w_left.setdata:
-        del w_left.setdata[w_item]
+    try:
+        if w_item in w_left.setdata:
+            del w_left.setdata[w_item]
+    except Exception, exp:
+        if _is_setlike(space, w_item):
+            w_f = space.newfrozenset(w_item)
+            if w_f in w_left.setdata:
+                del w_left.setdata[w_f]
+        else:
+            raise exp
     
 def set_remove__Set_ANY(space, w_left, w_item):
     try:
@@ -305,6 +324,16 @@
     except KeyError:
         raise OperationError(space.w_KeyError,
                 space.call_method(w_item,'__repr__'))
+    except Exception, exp:
+        if _is_setlike(space, w_item):
+            w_f = space.newfrozenset(w_item)
+            try:
+                del w_left.setdata[w_f]
+            except KeyError:
+                raise OperationError(space.w_KeyError,
+                        space.call_method(w_item,'__repr__'))
+        else:
+            raise exp
 
 def hash__Set(space, w_set):
     raise OperationError(space.w_TypeError,
@@ -339,18 +368,15 @@
 def set_intersection__Set_ANY(space, w_left, w_other):
     ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
     new_ld, rd = _intersection_dict(space, ld, rd, False)
-    return _dict_to_set(space, new_ld)
+    w_obj = w_left._newobj(space)
+    w_obj.setdata.update(new_ld)
+    return w_obj
 
 and__Set_Set = set_intersection__Set_ANY
 and__Set_Frozenset = set_intersection__Set_ANY
-
-def frozenset_intersection__Frozenset_ANY(space, w_left, w_other):
-    ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
-    new_ld, rd = _intersection_dict(space, ld, rd, False)
-    return _dict_to_frozenset(space, new_ld)
-
-and__Frozenset_Set = frozenset_intersection__Frozenset_ANY
-and__Frozenset_Frozenset = frozenset_intersection__Frozenset_ANY
+frozenset_intersection__Frozenset_ANY = set_intersection__Set_ANY
+and__Frozenset_Set = set_intersection__Set_ANY
+and__Frozenset_Frozenset = set_intersection__Set_ANY
 
 def set_intersection_update__Set_ANY(space, w_left, w_other):
     ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
@@ -366,18 +392,17 @@
 def set_symmetric_difference__Set_ANY(space, w_left, w_other):
     ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
     new_ld, rd = _symmetric_difference_dict(space, ld, rd, False)
-    return _dict_to_set(space, new_ld)
+    w_obj = w_left._newobj(space)
+    w_obj.setdata.update(new_ld)
+    return w_obj
 
 xor__Set_Set = set_symmetric_difference__Set_ANY
 xor__Set_Frozenset = set_symmetric_difference__Set_ANY
 
-def frozenset_symmetric_difference__Frozenset_ANY(space, w_left, w_other):
-    ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
-    new_ld, rd = _symmetric_difference_dict(space, ld, rd, False)
-    return _dict_to_frozenset(space, new_ld)
-
-xor__Frozenset_Set = frozenset_symmetric_difference__Frozenset_ANY
-xor__Frozenset_Frozenset = frozenset_symmetric_difference__Frozenset_ANY
+frozenset_symmetric_difference__Frozenset_ANY = \
+        set_symmetric_difference__Set_ANY
+xor__Frozenset_Set = set_symmetric_difference__Set_ANY
+xor__Frozenset_Frozenset = set_symmetric_difference__Set_ANY
 
 def set_symmetric_difference_update__Set_ANY(space, w_left, w_other):
     ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
@@ -393,18 +418,15 @@
 def set_union__Set_ANY(space, w_left, w_other):
     ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
     new_ld, rd = _union_dict(space, ld, rd, False)
-    return _dict_to_set(space, new_ld)
+    w_obj = w_left._newobj(space)
+    w_obj.setdata.update(new_ld)
+    return w_obj
 
 or__Set_Set = set_union__Set_ANY
 or__Set_Frozenset = set_union__Set_ANY
-
-def frozenset_union__Frozenset_ANY(space, w_left, w_other):
-    ld, rd = w_left.setdata, _iter_to_dict(space, w_other)
-    new_ld, rd = _union_dict(space, ld, rd, False)
-    return _dict_to_frozenset(space, new_ld)
-
-or__Frozenset_Set = frozenset_union__Frozenset_ANY
-or__Frozenset_Frozenset = frozenset_union__Frozenset_ANY
+frozenset_union__Frozenset_ANY = set_union__Set_ANY
+or__Frozenset_Set = set_union__Set_ANY
+or__Frozenset_Frozenset = set_union__Set_ANY
 
 def len__Set(space, w_left):
     return space.newint(len(w_left.setdata))
@@ -428,7 +450,7 @@
     w_iterable, = __args__.parse('set',
                             (['some_iterable'], None, None),
                             [W_SetObject(space,None)])
-    W_SetObject.__init__(w_set, space, w_iterable)
+    _initialize_set(space, w_set, w_iterable)
 
 app = gateway.applevel("""
     def ne__Set_ANY(s, o):
@@ -441,10 +463,7 @@
         return s != o and s.issubset(o)
 
     def repr__Set(s):
-        return 'set(%s)' % [x for x in s]
-
-    def repr__Frozenset(s):
-        return 'frozenset(%s)' % [x for x in s]
+        return '%s(%s)' % (s.__class__.__name__, [x for x in s])
 
 """, filename=__file__)
 
@@ -462,7 +481,7 @@
 lt__Frozenset_Frozenset = lt__Set_Set
 
 repr__Set = app.interphook('repr__Set')
-repr__Frozenset = app.interphook('repr__Frozenset')
+repr__Frozenset = app.interphook('repr__Set')
 
 from pypy.objspace.std import frozensettype
 from pypy.objspace.std import settype



More information about the Pypy-commit mailing list