diff options
Diffstat (limited to 'src/if_python3.c')
-rw-r--r-- | src/if_python3.c | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/src/if_python3.c b/src/if_python3.c index 644cf188a..ebf402a4b 100644 --- a/src/if_python3.c +++ b/src/if_python3.c @@ -855,8 +855,8 @@ PythonIO_Fini(void) static Py_ssize_t BufferLength(PyObject *); static PyObject *BufferItem(PyObject *, Py_ssize_t); -static PyObject* BufferSubscript(PyObject *self, PyObject* idx); -static Py_ssize_t BufferAsSubscript(PyObject *self, PyObject* idx, PyObject* val); +static PyObject* BufferSubscript(PyObject *self, PyObject *idx); +static Py_ssize_t BufferAsSubscript(PyObject *self, PyObject *idx, PyObject *val); /* Line range type - Implementation functions @@ -865,8 +865,9 @@ static Py_ssize_t BufferAsSubscript(PyObject *self, PyObject* idx, PyObject* val #define RangeType_Check(obj) ((obj)->ob_base.ob_type == &RangeType) -static PyObject* RangeSubscript(PyObject *self, PyObject* idx); +static PyObject* RangeSubscript(PyObject *self, PyObject *idx); static Py_ssize_t RangeAsItem(PyObject *, Py_ssize_t, PyObject *); +static Py_ssize_t RangeAsSubscript(PyObject *self, PyObject *idx, PyObject *val); /* Current objects type - Implementation functions * ----------------------------------------------- @@ -1035,7 +1036,7 @@ BufferSubscript(PyObject *self, PyObject* idx) &step, &slicelen) < 0) { return NULL; } - return BufferSlice(self,start,stop); + return BufferSlice(self, start, stop); } else { PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); return NULL; @@ -1084,7 +1085,7 @@ static PySequenceMethods RangeAsSeq = { PyMappingMethods RangeAsMapping = { /* mp_length */ (lenfunc)RangeLength, /* mp_subscript */ (binaryfunc)RangeSubscript, - /* mp_ass_subscript */ (objobjargproc)0, + /* mp_ass_subscript */ (objobjargproc)RangeAsSubscript, }; /* Line range object - Implementation @@ -1123,6 +1124,15 @@ RangeAsItem(PyObject *self, Py_ssize_t n, PyObject *val) &((RangeObject *)(self))->end); } + static Py_ssize_t +RangeAsSlice(PyObject *self, Py_ssize_t lo, Py_ssize_t hi, PyObject *val) +{ + return RBAsSlice(((RangeObject *)(self))->buf, lo, hi, val, + ((RangeObject *)(self))->start, + ((RangeObject *)(self))->end, + &((RangeObject *)(self))->end); +} + static PyObject * RangeSubscript(PyObject *self, PyObject* idx) { @@ -1138,13 +1148,36 @@ RangeSubscript(PyObject *self, PyObject* idx) &step, &slicelen) < 0) { return NULL; } - return RangeSlice(self,start,stop+1); + return RangeSlice(self, start, stop); } else { PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); return NULL; } } + static Py_ssize_t +RangeAsSubscript(PyObject *self, PyObject *idx, PyObject *val) +{ + if (PyLong_Check(idx)) { + long n = PyLong_AsLong(idx); + return RangeAsItem(self, n, val); + } else if (PySlice_Check(idx)) { + Py_ssize_t start, stop, step, slicelen; + + if (PySlice_GetIndicesEx((PySliceObject *)idx, + ((RangeObject *)(self))->end-((RangeObject *)(self))->start+1, + &start, &stop, + &step, &slicelen) < 0) { + return -1; + } + return RangeAsSlice(self, start, stop, val); + } else { + PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); + return -1; + } +} + + /* Buffer list object - Definitions */ |