Author: Armin Rigo <[email protected]>
Branch: 
Changeset: r72625:0764713cbb49
Date: 2014-07-31 16:34 +0200
http://bitbucket.org/pypy/pypy/changeset/0764713cbb49/

Log:    Fix comparison of lltype._ptr if they are delayed.

diff --git a/rpython/rtyper/lltypesystem/lltype.py 
b/rpython/rtyper/lltypesystem/lltype.py
--- a/rpython/rtyper/lltypesystem/lltype.py
+++ b/rpython/rtyper/lltypesystem/lltype.py
@@ -1154,7 +1154,12 @@
                 type(other).__name__,))
         if self._TYPE != other._TYPE:
             raise TypeError("comparing %r and %r" % (self._TYPE, other._TYPE))
-        return self._obj == other._obj
+        try:
+            return self._obj == other._obj
+        except DelayedPointer:
+            # if one of the two pointers is delayed, they cannot
+            # possibly be equal unless they are the same _ptr instance
+            return self is other
 
     def __ne__(self, other):
         return not (self == other)
diff --git a/rpython/rtyper/test/test_annlowlevel.py 
b/rpython/rtyper/test/test_annlowlevel.py
--- a/rpython/rtyper/test/test_annlowlevel.py
+++ b/rpython/rtyper/test/test_annlowlevel.py
@@ -64,3 +64,13 @@
         assert lltype.typeOf(ptr) == OBJECTPTR
         y = annlowlevel.cast_base_ptr_to_instance(X, ptr)
         assert y is x
+
+    def test_delayedptr(self):
+        FUNCTYPE = lltype.FuncType([], lltype.Signed)
+        name = "delayed!myfunc"
+        delayedptr1 = lltype._ptr(lltype.Ptr(FUNCTYPE), name, solid=True)
+        delayedptr2 = lltype._ptr(lltype.Ptr(FUNCTYPE), name, solid=True)
+        assert delayedptr1 == delayedptr1
+        assert delayedptr1 != delayedptr2
+        assert bool(delayedptr1)
+        assert delayedptr1 != lltype.nullptr(FUNCTYPE)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to