# HG changeset patch # Parent 0685f51e9891e7a2d9bd14e7c920f416a4c5a108 diff -r 0685f51e9891 Include/memoryobject.h --- a/Include/memoryobject.h Sat May 26 22:09:59 2012 +0100 +++ b/Include/memoryobject.h Mon May 28 01:15:34 2012 +0100 @@ -63,6 +63,7 @@ Py_ssize_t exports; /* number of buffer re-exports */ Py_buffer view; /* private copy of the exporter's view */ char format[_Py_MEMORYVIEW_MAX_FORMAT]; /* used for casting */ + PyObject *weakreflist; Py_ssize_t ob_array[1]; /* shape, strides, suboffsets */ } PyMemoryViewObject; #endif diff -r 0685f51e9891 Lib/test/test_memoryview.py --- a/Lib/test/test_memoryview.py Sat May 26 22:09:59 2012 +0100 +++ b/Lib/test/test_memoryview.py Mon May 28 01:15:34 2012 +0100 @@ -336,6 +336,20 @@ m = self._view(b) self.assertRaises(ValueError, hash, m) + def test_weakref(self): + # Check memoryviews are weakrefable + for tp in self._types: + b = tp(self._source) + m = self._view(b) + L = [] + def callback(wr, b=b): + L.append(b) + wr = weakref.ref(m, callback) + self.assertIs(wr(), m) + del m + self.assertIs(wr(), None) + self.assertIs(L[0], b) + # Variations on source objects for the buffer: bytes-like objects, then arrays # with itemsize > 1. # NOTE: support for multi-dimensional objects is unimplemented. diff -r 0685f51e9891 Objects/memoryobject.c --- a/Objects/memoryobject.c Sat May 26 22:09:59 2012 +0100 +++ b/Objects/memoryobject.c Mon May 28 01:15:34 2012 +0100 @@ -595,6 +595,7 @@ mv->view.shape = mv->ob_array; mv->view.strides = mv->ob_array + ndim; mv->view.suboffsets = mv->ob_array + 2 * ndim; + mv->weakreflist = NULL; _PyObject_GC_TRACK(mv); return mv; @@ -967,6 +968,8 @@ { assert(self->exports == 0); _PyObject_GC_UNTRACK(self); + if (self->weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *) self); (void)_memory_release(self); Py_CLEAR(self->mbuf); PyObject_GC_Del(self); @@ -2608,7 +2611,7 @@ (traverseproc)memory_traverse, /* tp_traverse */ (inquiry)memory_clear, /* tp_clear */ memory_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ + offsetof(PyMemoryViewObject, weakreflist),/* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ memory_methods, /* tp_methods */