505
505
return get_shape0(&self->view);
508
/* Alternate version of memory_subcript that only accepts indices.
509
Used by PySeqIter_New().
512
memory_item(PyMemoryViewObject *self, Py_ssize_t result)
514
Py_buffer *view = &(self->view);
516
if (view->ndim == 0) {
517
PyErr_SetString(PyExc_IndexError,
518
"invalid indexing of 0-dim memory");
521
if (view->ndim == 1) {
522
/* Return a bytes object */
524
ptr = (char *)view->buf;
526
result += get_shape0(view);
528
if ((result < 0) || (result >= get_shape0(view))) {
529
PyErr_SetString(PyExc_IndexError,
530
"index out of bounds");
533
if (view->strides == NULL)
534
ptr += view->itemsize * result;
536
ptr += view->strides[0] * result;
537
if (view->suboffsets != NULL &&
538
view->suboffsets[0] >= 0) {
539
ptr = *((char **)ptr) + view->suboffsets[0];
541
return PyBytes_FromStringAndSize(ptr, view->itemsize);
543
/* Return a new memory-view object */
545
memset(&newview, 0, sizeof(newview));
546
/* XXX: This needs to be fixed so it actually returns a sub-view */
547
return PyMemoryView_FromBuffer(&newview);
509
552
mem[obj] returns a bytes object holding the data for one element if
510
553
obj fully indexes the memory view or another memory-view object
536
579
result = PyNumber_AsSsize_t(key, NULL);
537
580
if (result == -1 && PyErr_Occurred())
539
if (view->ndim == 1) {
540
/* Return a bytes object */
542
ptr = (char *)view->buf;
544
result += get_shape0(view);
546
if ((result < 0) || (result >= get_shape0(view))) {
547
PyErr_SetString(PyExc_IndexError,
548
"index out of bounds");
551
if (view->strides == NULL)
552
ptr += view->itemsize * result;
554
ptr += view->strides[0] * result;
555
if (view->suboffsets != NULL &&
556
view->suboffsets[0] >= 0) {
557
ptr = *((char **)ptr) + view->suboffsets[0];
559
return PyBytes_FromStringAndSize(ptr, view->itemsize);
562
/* Return a new memory-view object */
564
memset(&newview, 0, sizeof(newview));
565
/* XXX: This needs to be fixed so it
566
actually returns a sub-view
568
return PyMemoryView_FromBuffer(&newview);
582
return memory_item(self, result);
571
584
else if (PySlice_Check(key)) {
572
585
Py_ssize_t start, stop, step, slicelength;
792
811
0, /* tp_reserved */
793
812
(reprfunc)memory_repr, /* tp_repr */
794
813
0, /* tp_as_number */
795
0, /* tp_as_sequence */
814
&memory_as_sequence, /* tp_as_sequence */
796
815
&memory_as_mapping, /* tp_as_mapping */