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