diff -r f7db966c9fee Objects/memoryobject.c --- a/Objects/memoryobject.c Sun Nov 01 00:55:31 2015 +0300 +++ b/Objects/memoryobject.c Sun Nov 01 15:55:28 2015 +0200 @@ -63,13 +63,12 @@ mbuf_alloc(void) _PyManagedBufferObject *mbuf; mbuf = (_PyManagedBufferObject *) - PyObject_GC_New(_PyManagedBufferObject, &_PyManagedBuffer_Type); + PyObject_New(_PyManagedBufferObject, &_PyManagedBuffer_Type); if (mbuf == NULL) return NULL; mbuf->flags = 0; mbuf->exports = 0; mbuf->master.obj = NULL; - _PyObject_GC_TRACK(mbuf); return mbuf; } @@ -103,7 +102,6 @@ mbuf_release(_PyManagedBufferObject *sel self->flags |= _Py_MANAGED_BUFFER_RELEASED; /* PyBuffer_Release() decrements master->obj and sets it to NULL. */ - _PyObject_GC_UNTRACK(self); PyBuffer_Release(&self->master); } @@ -114,22 +112,7 @@ mbuf_dealloc(_PyManagedBufferObject *sel mbuf_release(self); if (self->flags&_Py_MANAGED_BUFFER_FREE_FORMAT) PyMem_Free(self->master.format); - PyObject_GC_Del(self); -} - -static int -mbuf_traverse(_PyManagedBufferObject *self, visitproc visit, void *arg) -{ - Py_VISIT(self->master.obj); - return 0; -} - -static int -mbuf_clear(_PyManagedBufferObject *self) -{ - assert(self->exports >= 0); - mbuf_release(self); - return 0; + PyObject_Del(self); } PyTypeObject _PyManagedBuffer_Type = { @@ -152,10 +135,10 @@ PyTypeObject _PyManagedBuffer_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ 0, /* tp_doc */ - (traverseproc)mbuf_traverse, /* tp_traverse */ - (inquiry)mbuf_clear /* tp_clear */ + 0, /* tp_traverse */ + 0 /* tp_clear */ }; @@ -1066,13 +1049,15 @@ memory_dealloc(PyMemoryViewObject *self) static int memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg) { - Py_VISIT(self->mbuf); + Py_VISIT(self->mbuf->master.obj); return 0; } static int memory_clear(PyMemoryViewObject *self) { + if (self->exports != 0) + return 0; (void)_memory_release(self); Py_CLEAR(self->mbuf); return 0;