diff --git a/Include/memoryobject.h b/Include/memoryobject.h index bf0b621ab92..5bbfb05ab57 100644 --- a/Include/memoryobject.h +++ b/Include/memoryobject.h @@ -63,7 +63,6 @@ PyAPI_FUNC(PyObject *) PyMemoryView_FromBuffer(Py_buffer *info); and functions instead! */ typedef struct { PyObject_HEAD - PyObject *base; Py_buffer view; } PyMemoryViewObject; diff --git a/Include/object.h b/Include/object.h index f14fd07a04a..bc528fdee1f 100644 --- a/Include/object.h +++ b/Include/object.h @@ -189,7 +189,6 @@ typedef void (*releasebufferproc)(PyObject *, Py_buffer *); #define PyBUF_READ 0x100 #define PyBUF_WRITE 0x200 -#define PyBUF_SHADOW 0x400 /* End buffer interface */ diff --git a/Lib/test/test_sys.py b/Lib/test/test_sys.py index 5736b44658e..a5c9115edbd 100644 --- a/Lib/test/test_sys.py +++ b/Lib/test/test_sys.py @@ -759,7 +759,7 @@ class SizeofTest(unittest.TestCase): check(int(PyLong_BASE**2-1), size(vh) + 2*self.longdigit) check(int(PyLong_BASE**2), size(vh) + 3*self.longdigit) # memory - check(memoryview(b''), size(h + 'P PP2P2i7P')) + check(memoryview(b''), size(h + 'PP2P2i7P')) # module check(unittest, size(h + '3P')) # None diff --git a/Misc/NEWS b/Misc/NEWS index 39c3bf07bc9..50bc33a58ab 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,10 @@ What's New in Python 3.2 Beta 1? Core and Builtins ----------------- +- Issue #10293: Remove obsolete field in the PyMemoryView structure, + unused undocumented value PyBUF_SHADOW, and strangely-looking code in + PyMemoryView_GetContiguous. + - Issue #6081: Add str.format_map, similar to str.format(**mapping). - If FileIO.__init__ fails, close the file descriptor. diff --git a/Objects/memoryobject.c b/Objects/memoryobject.c index 432673091da..ba9e08b9ab0 100644 --- a/Objects/memoryobject.c +++ b/Objects/memoryobject.c @@ -82,7 +82,6 @@ PyMemoryView_FromBuffer(Py_buffer *info) PyObject_GC_New(PyMemoryViewObject, &PyMemoryView_Type); if (mview == NULL) return NULL; - mview->base = NULL; dup_buffer(&mview->view, info); /* NOTE: mview->view.obj should already have been incref'ed as part of PyBuffer_FillInfo(). */ @@ -112,8 +111,6 @@ PyMemoryView_FromObject(PyObject *base) return NULL; } - mview->base = base; - Py_INCREF(base); return (PyObject *)mview; } @@ -291,8 +288,6 @@ PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char fort) if (PyBuffer_IsContiguous(view, fort)) { /* no copy needed */ - Py_INCREF(obj); - mem->base = obj; _PyObject_GC_TRACK(mem); return (PyObject *)mem; } @@ -324,21 +319,7 @@ PyMemoryView_GetContiguous(PyObject *obj, int buffertype, char fort) Py_DECREF(mem); return NULL; } - } - if (buffertype == PyBUF_SHADOW) { - /* return a shadowed memory-view object */ - view->buf = dest; - mem->base = PyTuple_Pack(2, obj, bytes); - Py_DECREF(bytes); - if (mem->base == NULL) { - Py_DECREF(mem); - return NULL; - } - } - else { PyBuffer_Release(view); /* XXX ? */ - /* steal the reference */ - mem->base = bytes; } _PyObject_GC_TRACK(mem); return (PyObject *)mem; @@ -481,28 +462,7 @@ static void do_release(PyMemoryViewObject *self) { if (self->view.obj != NULL) { - if (self->base && PyTuple_Check(self->base)) { - /* Special case when first element is generic object - with buffer interface and the second element is a - contiguous "shadow" that must be copied back into - the data areay of the first tuple element before - releasing the buffer on the first element. - */ - - PyObject_CopyData(PyTuple_GET_ITEM(self->base,0), - PyTuple_GET_ITEM(self->base,1)); - - /* The view member should have readonly == -1 in - this instance indicating that the memory can - be "locked" and was locked and will be unlocked - again after this call. - */ - PyBuffer_Release(&(self->view)); - } - else { - PyBuffer_Release(&(self->view)); - } - Py_CLEAR(self->base); + PyBuffer_Release(&(self->view)); } self->view.obj = NULL; self->view.buf = NULL; @@ -819,8 +779,6 @@ _notimpl: static int memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg) { - if (self->base != NULL) - Py_VISIT(self->base); if (self->view.obj != NULL) Py_VISIT(self->view.obj); return 0; @@ -829,7 +787,6 @@ memory_traverse(PyMemoryViewObject *self, visitproc visit, void *arg) static int memory_clear(PyMemoryViewObject *self) { - Py_CLEAR(self->base); PyBuffer_Release(&self->view); return 0; }