Index: Objects/memoryobject.c =================================================================== --- Objects/memoryobject.c (revision 73529) +++ Objects/memoryobject.c (working copy) @@ -608,7 +608,49 @@ return NULL; } +/* Alternate version of memory_subcript that only accepts indices. + Used by PySequence_Iter(). +*/ +static PyObject * +memory_item(PyMemoryViewObject *self, Py_ssize_t result) +{ + Py_buffer *view = &(self->view); + if (view->ndim == 0) { + PyErr_SetString(PyExc_IndexError, + "invalid indexing of 0-dim memory"); + return NULL; + } + if (view->ndim == 1) { + /* Return a bytes object */ + char *ptr; + ptr = (char *)view->buf; + if (result < 0) { + result += get_shape0(view); + } + if ((result < 0) || (result >= get_shape0(view))) { + PyErr_SetString(PyExc_IndexError, + "index out of bounds"); + return NULL; + } + if (view->strides == NULL) + ptr += view->itemsize * result; + else + ptr += view->strides[0] * result; + if (view->suboffsets != NULL && + view->suboffsets[0] >= 0) { + ptr = *((char **)ptr) + view->suboffsets[0]; + } + return PyBytes_FromStringAndSize(ptr, view->itemsize); + } else { + Py_buffer newview; + /* Return a new memory-view object */ + memset(&newview, 0, sizeof(newview)); + /* XXX: This needs to be fixed so it actually returns a sub-view */ + return PyMemoryView_FromBuffer(&newview); + } +} + /* Need to support assigning memory if we can */ static int memory_ass_sub(PyMemoryViewObject *self, PyObject *key, PyObject *value) @@ -771,6 +813,12 @@ (objobjargproc)memory_ass_sub, /* mp_ass_subscript */ }; +static PySequenceMethods memory_as_sequence = { + 0, /* sq_length */ + 0, /* sq_concat */ + 0, /* sq_repeat */ + (ssizeargfunc)memory_item, /* sq_item */ +}; /* Buffer methods */ @@ -792,7 +840,7 @@ 0, /* tp_reserved */ (reprfunc)memory_repr, /* tp_repr */ 0, /* tp_as_number */ - 0, /* tp_as_sequence */ + &memory_as_sequence, /* tp_as_sequence */ &memory_as_mapping, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ Index: Misc/NEWS =================================================================== --- Misc/NEWS (revision 73529) +++ Misc/NEWS (working copy) @@ -12,6 +12,9 @@ Core and Builtins ----------------- +- Issue #6329: Fixed iteration for memoryview objects (it was being blocked + because it wasn't recognized as a sequence). + Library ------- Index: Lib/test/test_memoryview.py =================================================================== --- Lib/test/test_memoryview.py (revision 73529) +++ Lib/test/test_memoryview.py (working copy) @@ -48,6 +48,12 @@ for tp in self._types: self.check_getitem_with_type(tp) + def test_iter(self): + for tp in self._types: + b = tp(self._source) + m = self._view(b) + self.assertEqual(list(m), [m[i] for i in range(len(m))]) + def test_setitem_readonly(self): if not self.ro_type: return