]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.307 v7.3.307
authorBram Moolenaar <Bram@vim.org>
Wed, 14 Sep 2011 13:01:58 +0000 (15:01 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 14 Sep 2011 13:01:58 +0000 (15:01 +0200)
Problem:    Python 3 doesn't support slice assignment.
Solution:   Implement slices. (Brett Overesch, Roland Puntaier)

src/if_python3.c
src/version.c

index 644cf188aa8e0e8ecd010981bf8af10c0f754e8f..ebf402a4b0e35228414e82bc31f4c710f38be2b0 100644 (file)
@@ -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, PyObjectidx);
-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, PyObjectidx);
+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
  */
 
index 74ed44da476652cf2664c956874e7fba513d1915..74c27baae8d7857919b7fd28804c8779c9c87806 100644 (file)
@@ -709,6 +709,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    307,
 /**/
     306,
 /**/