# HG changeset patch # Parent f26721ab34766304976972f3919d975f3355884d diff -r f26721ab3476 Include/memoryobject.h --- a/Include/memoryobject.h Sun May 27 22:34:33 2012 -0700 +++ b/Include/memoryobject.h Mon May 28 15:05:55 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 f26721ab3476 Lib/test/test_memoryview.py --- a/Lib/test/test_memoryview.py Sun May 27 22:34:33 2012 -0700 +++ b/Lib/test/test_memoryview.py Mon May 28 15:05:55 2012 +0100 @@ -336,6 +336,21 @@ 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 + test.support.gc_collect() + 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 f26721ab3476 Objects/memoryobject.c --- a/Objects/memoryobject.c Sun May 27 22:34:33 2012 -0700 +++ b/Objects/memoryobject.c Mon May 28 15:05:55 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; @@ -969,6 +970,8 @@ _PyObject_GC_UNTRACK(self); (void)_memory_release(self); Py_CLEAR(self->mbuf); + if (self->weakreflist != NULL) + PyObject_ClearWeakRefs((PyObject *) self); 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 */