Author: Antonio Cuni <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit