Author: Carl Friedrich Bolz <cfb...@gmx.de>
Branch: list-strategies
Changeset: r47678:29e932a272a4
Date: 2011-09-29 14:28 +0200
http://bitbucket.org/pypy/pypy/changeset/29e932a272a4/

Log:    implement is and id for complex, fix -0.0 behaviour

diff --git a/pypy/objspace/std/objspace.py b/pypy/objspace/std/objspace.py
--- a/pypy/objspace/std/objspace.py
+++ b/pypy/objspace/std/objspace.py
@@ -452,18 +452,33 @@
         return self.newbool(self.is_w(w_one, w_two))
 
     def is_w(self, w_one, w_two):
+        from pypy.rlib.rstruct import ieee
+        w_typeone = self.type(w_one)
         # cannot use self.is_w here to not get infinite recursion
-        w_typeone = self.type(w_one)
         if w_typeone is self.w_int:
             return (self.type(w_two) is self.w_int and
                     self.int_w(w_one) == self.int_w(w_two))
         elif w_typeone is self.w_float:
-            return (self.type(w_two) is self.w_float and
-                    self.float_w(w_one) == self.float_w(w_two))
+            if self.type(w_two) is not self.w_float:
+                return False
+            one = ieee.float_pack(self.float_w(w_one), 8)
+            two = ieee.float_pack(self.float_w(w_two), 8)
+            return one == two
         elif w_typeone is self.w_long:
             return (self.type(w_two) is self.w_long and
                     self.bigint_w(w_one).eq(self.bigint_w(w_two)))
-        # XXX complex?
+        elif w_typeone is self.w_complex:
+            if self.type(w_two) is not self.w_complex:
+                return False
+            real1 = self.float_w(self.getattr(w_one, self.wrap("real")))
+            real2 = self.float_w(self.getattr(w_two, self.wrap("real")))
+            imag1 = self.float_w(self.getattr(w_one, self.wrap("imag")))
+            imag2 = self.float_w(self.getattr(w_two, self.wrap("imag")))
+            real1 = ieee.float_pack(real1, 8)
+            real2 = ieee.float_pack(real2, 8)
+            imag1 = ieee.float_pack(imag1, 8)
+            imag2 = ieee.float_pack(imag2, 8)
+            return real1 == real2 and imag1 == imag2
         elif w_typeone is self.w_str:
             return (self.type(w_two) is self.w_str and
                     self.str_w(w_one) is self.str_w(w_two))
@@ -473,7 +488,8 @@
         return w_one is w_two
 
     def id(self, w_obj):
-        from pypy.rlib import objectmodel, rbigint
+        from pypy.rlib.rbigint import rbigint
+        from pypy.rlib import objectmodel
         from pypy.rlib.rstruct import ieee
         w_type = self.type(w_obj)
         if w_type is self.w_int:
@@ -485,9 +501,16 @@
         elif w_type is self.w_float:
             tag = 5
             val = ieee.float_pack(self.float_w(w_obj), 8)
-            w_obj = 
self.newlong_from_rbigint(rbigint.rbigint.fromrarith_int(val))
+            w_obj = self.newlong_from_rbigint(rbigint.fromrarith_int(val))
             return self.or_(self.lshift(w_obj, self.wrap(3)), self.wrap(tag))
-        # XXX complex?
+        elif w_type is self.w_complex:
+            real = self.float_w(self.getattr(w_obj, self.wrap("real")))
+            imag = self.float_w(self.getattr(w_obj, self.wrap("imag")))
+            tag = 5
+            real_b = rbigint.fromrarith_int(ieee.float_pack(real, 8))
+            imag_b = rbigint.fromrarith_int(ieee.float_pack(imag, 8))
+            val = real_b.lshift(8 * 
8).or_(imag_b).lshift(3).or_(rbigint.fromint(3))
+            return self.newlong_from_rbigint(val)
         elif w_type is self.w_str:
             res = objectmodel.compute_unique_id(self.str_w(w_obj))
         elif w_type is self.w_unicode:
diff --git a/pypy/objspace/std/test/test_obj.py 
b/pypy/objspace/std/test/test_obj.py
--- a/pypy/objspace/std/test/test_obj.py
+++ b/pypy/objspace/std/test/test_obj.py
@@ -120,18 +120,22 @@
         assert 1 is not 1l
         assert 1l is not 1.0
         assert 1.1 is 1.1
+        assert 0.0 is not -0.0
         for x in range(10):
             assert x + 0.1 is x + 0.1
         for x in range(10):
             assert x + 1L is x + 1L
-        #for x in range(10):
-        #    assert x+1j is x+1j
+        for x in range(10):
+            assert x+1j is x+1j
+            assert 1+x*1j is 1+x*1j
         l = [1]
         assert l[0] is l[0]
         l = ["a"]
         assert l[0] is l[0]
         u = u"a"
         assert self.unwrap_wrap_unicode(u) is u
+        s = "a"
+        assert self.unwrap_wrap_str(s) is s
 
     def test_id(self):
         assert id(1) == (1 << 3) + 1
@@ -149,3 +153,38 @@
         assert id(self.unwrap_wrap_unicode(u)) == id(u)
         s = "a"
         assert id(self.unwrap_wrap_str(s)) == id(s)
+
+    def test_identity_vs_id(self):
+        import sys
+        l = range(-10, 10)
+        for i in range(10):
+            l.append(float(i))
+            l.append(i + 0.1)
+            l.append(long(i))
+            l.append(i + sys.maxint)
+            l.append(i - sys.maxint)
+            l.append(i + 1j)
+            l.append(1 + i * 1j)
+            s = str(i)
+            l.append(s)
+            l.append(self.unwrap_wrap_str(s))
+            u = unicode(s)
+            l.append(u)
+            l.append(self.unwrap_wrap_unicode(u))
+        l.append(-0.0)
+        l.append(None)
+        l.append(True)
+        l.append(False)
+        s = "s"
+        l.append(s)
+        l.append(self.unwrap_wrap_str(s))
+        s = u"s"
+        l.append(s)
+        l.append(self.unwrap_wrap_unicode(s))
+
+        for a in l:
+            for b in l:
+                assert (a is b) == (id(a) == id(b))
+                if a is b:
+                    assert a == b
+
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to