To: vim_dev@googlegroups.com Subject: Patch 7.3.307 Fcc: outbox From: Bram Moolenaar 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 *** ../vim-7.3.306/src/if_python3.c 2011-08-28 16:00:14.000000000 +0200 --- src/if_python3.c 2011-09-14 15:01:26.000000000 +0200 *************** *** 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 */ *** ../vim-7.3.306/src/version.c 2011-09-14 14:43:21.000000000 +0200 --- src/version.c 2011-09-14 14:58:16.000000000 +0200 *************** *** 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 ///