| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.307 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.307 |
| Problem: Python 3 doesn't support slice assignment. |
| Solution: Implement slices. (Brett Overesch, Roland Puntaier) |
| Files: src/if_python3.c |
| |
| |
| |
| |
| |
| *** 855,862 **** |
| |
| 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); |
| |
| |
| /* Line range type - Implementation functions |
| --- 855,862 ---- |
| |
| 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); |
| |
| |
| /* Line range type - Implementation functions |
| |
| *** 865,872 **** |
| |
| #define RangeType_Check(obj) ((obj)->ob_base.ob_type == &RangeType) |
| |
| ! static PyObject* RangeSubscript(PyObject *self, PyObject* idx); |
| static Py_ssize_t RangeAsItem(PyObject *, Py_ssize_t, PyObject *); |
| |
| /* Current objects type - Implementation functions |
| * ----------------------------------------------- |
| --- 865,873 ---- |
| |
| #define RangeType_Check(obj) ((obj)->ob_base.ob_type == &RangeType) |
| |
| ! 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,1041 **** |
| &step, &slicelen) < 0) { |
| return NULL; |
| } |
| ! return BufferSlice(self,start,stop); |
| } else { |
| PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); |
| return NULL; |
| --- 1036,1042 ---- |
| &step, &slicelen) < 0) { |
| return NULL; |
| } |
| ! return BufferSlice(self, start, stop); |
| } else { |
| PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); |
| return NULL; |
| |
| *** 1084,1090 **** |
| PyMappingMethods RangeAsMapping = { |
| /* mp_length */ (lenfunc)RangeLength, |
| /* mp_subscript */ (binaryfunc)RangeSubscript, |
| ! /* mp_ass_subscript */ (objobjargproc)0, |
| }; |
| |
| /* Line range object - Implementation |
| --- 1085,1091 ---- |
| PyMappingMethods RangeAsMapping = { |
| /* mp_length */ (lenfunc)RangeLength, |
| /* mp_subscript */ (binaryfunc)RangeSubscript, |
| ! /* mp_ass_subscript */ (objobjargproc)RangeAsSubscript, |
| }; |
| |
| /* Line range object - Implementation |
| |
| *** 1123,1128 **** |
| --- 1124,1138 ---- |
| &((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,1150 **** |
| &step, &slicelen) < 0) { |
| return NULL; |
| } |
| ! return RangeSlice(self,start,stop+1); |
| } else { |
| PyErr_SetString(PyExc_IndexError, "Index must be int or slice"); |
| return NULL; |
| } |
| } |
| |
| /* Buffer list object - Definitions |
| */ |
| |
| --- 1148,1183 ---- |
| &step, &slicelen) < 0) { |
| return NULL; |
| } |
| ! 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 |
| */ |
| |
| |
| |
| |
| *** 711,712 **** |
| --- 711,714 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 307, |
| /**/ |
| |
| -- |
| The process for understanding customers primarily involves sitting around with |
| other marketing people and talking about what you would to if you were dumb |
| enough to be a customer. |
| (Scott Adams - The Dilbert principle) |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |