# HG changeset patch # User Bram Moolenaar # Date 1316005318 -7200 # Node ID 880b7dd69331d1fefaf2d8735b118b39d546280c # Parent c5ee8a44738a4b509be1d905a3e263fac53ed9a0 updated for version 7.3.307 Problem: Python 3 doesn't support slice assignment. Solution: Implement slices. (Brett Overesch, Roland Puntaier) diff --git a/src/if_python3.c b/src/if_python3.c --- 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(PyOb #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 &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 &((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* &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 */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -710,6 +710,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 307, +/**/ 306, /**/ 305,