Author: Antonio Cuni <anto.c...@gmail.com>
Branch: jitypes2
Changeset: r44616:3b67787ff314
Date: 2011-06-01 12:27 +0200
http://bitbucket.org/pypy/pypy/changeset/3b67787ff314/

Log:    make sure that pointer types can be compared by identity

diff --git a/pypy/module/_ffi/interp_ffi.py b/pypy/module/_ffi/interp_ffi.py
--- a/pypy/module/_ffi/interp_ffi.py
+++ b/pypy/module/_ffi/interp_ffi.py
@@ -124,9 +124,15 @@
 app_types.__dict__ = build_ffi_types()
 
 def descr_new_pointer(space, w_cls, w_pointer_to):
-    w_pointer_to = space.interp_w(W_FFIType, w_pointer_to)
-    name = '(pointer to %s)' % w_pointer_to.name
-    return W_FFIType(name, libffi.types.pointer, w_pointer_to = w_pointer_to)
+    try:
+        return descr_new_pointer.cache[w_pointer_to]
+    except KeyError:
+        w_pointer_to = space.interp_w(W_FFIType, w_pointer_to)
+        name = '(pointer to %s)' % w_pointer_to.name
+        w_result = W_FFIType(name, libffi.types.pointer, w_pointer_to = 
w_pointer_to)
+        descr_new_pointer.cache[w_pointer_to] = w_result
+        return w_result
+descr_new_pointer.cache = {}
 
 class W_types(Wrappable):
     pass
diff --git a/pypy/module/_ffi/test/test__ffi.py 
b/pypy/module/_ffi/test/test__ffi.py
--- a/pypy/module/_ffi/test/test__ffi.py
+++ b/pypy/module/_ffi/test/test__ffi.py
@@ -195,6 +195,14 @@
         assert types.sint.deref_pointer() is None
         raises(TypeError, "types.Pointer(42)")
 
+    def test_pointer_identity(self):
+        from _ffi import types
+        x = types.Pointer(types.slong)
+        y = types.Pointer(types.slong)
+        z = types.Pointer(types.char)
+        assert x is y
+        assert x is not z
+
     def test_typed_pointer_args(self):
         """
             extern int dummy; // defined in test_void_result 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to