]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.943 v7.3.943
authorBram Moolenaar <Bram@vim.org>
Sun, 12 May 2013 19:16:23 +0000 (21:16 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 12 May 2013 19:16:23 +0000 (21:16 +0200)
Problem:    Python: Negative indices were failing.
Solution:   Fix negative indices. Add tests. (ZyX)

src/if_py_both.h
src/if_python3.c
src/testdir/test86.in
src/testdir/test86.ok
src/testdir/test87.in
src/testdir/test87.ok
src/version.c

index 681b7a17295d76e6c24c4aac75fd7d6c87a0e968..eca07aebb62294f75488e49a9b11a565e9bd023a 100644 (file)
@@ -2394,6 +2394,9 @@ RBItem(BufferObject *self, PyInt n, PyInt start, PyInt end)
     if (end == -1)
        end = self->buf->b_ml.ml_line_count;
 
+    if (n < 0)
+       n += end - start + 1;
+
     if (n < 0 || n > end - start)
     {
        PyErr_SetString(PyExc_IndexError, _("line number out of range"));
@@ -2441,6 +2444,9 @@ RBAsItem(BufferObject *self, PyInt n, PyObject *val, PyInt start, PyInt end, PyI
     if (end == -1)
        end = self->buf->b_ml.ml_line_count;
 
+    if (n < 0)
+       n += end - start + 1;
+
     if (n < 0 || n > end - start)
     {
        PyErr_SetString(PyExc_IndexError, _("line number out of range"));
index da0867b7e0a9c09374468e9474292823067da5f2..daaf689b48d57d5155acf059f2f5819d0cb8cdf1 100644 (file)
@@ -1114,7 +1114,7 @@ BufferSubscript(PyObject *self, PyObject* idx)
            return NULL;
 
        if (PySlice_GetIndicesEx((PyObject *)idx,
-             (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1,
+             (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count,
              &start, &stop,
              &step, &slicelen) < 0)
        {
@@ -1146,7 +1146,7 @@ BufferAsSubscript(PyObject *self, PyObject* idx, PyObject* val)
            return -1;
 
        if (PySlice_GetIndicesEx((PyObject *)idx,
-             (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1,
+             (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count,
              &start, &stop,
              &step, &slicelen) < 0)
        {
index ca44807541e63089336a00ef86f7d52145378157..555a5fdf5d765d9e539fd628d727850e79dfdc87 100644 (file)
@@ -475,9 +475,50 @@ EOF
 :       endtry
 :   endfor
 :   call RecVars(oname)
-endtry
 :endfor
 :only
+:"
+:" Test buffer object
+:vnew
+:put ='First line'
+:put ='Second line'
+:put ='Third line'
+:1 delete _
+:py b=vim.current.buffer
+:wincmd w
+:mark a
+py << EOF
+cb = vim.current.buffer
+# Tests BufferAppend and BufferItem
+cb.append(b[0])
+# Tests BufferSlice and BufferAssSlice
+cb.append('abc') # Will be overwritten
+cb[-1:] = b[:-2]
+# Test BufferLength and BufferAssSlice
+cb.append('def') # Will not be overwritten
+cb[len(cb):] = b[:]
+# Test BufferAssItem and BufferMark
+cb.append('ghi') # Will be overwritten
+cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
+# Test BufferRepr
+cb.append(repr(cb) + repr(b))
+# Modify foreign buffer
+b.append('foo')
+b[0]='bar'
+b[0:0]=['baz']
+vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
+# Test CheckBuffer
+vim.command('bwipeout! ' + str(b.number))
+for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
+    try:
+        exec(expr)
+    except vim.error:
+        pass
+    else:
+        # Usually a SEGV here
+        # Should not happen in any case
+        cb.append('No exception for ' + expr)
+EOF
 :endfun
 :"
 :call Test()
index 2acfb98aeb9df0c717d030e4fb85f9f74d512f8b..cada813cc93559e0ba94e9e5c43878166938557f 100644 (file)
@@ -306,3 +306,16 @@ bar
   G: '.,,'
   W: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,'
   B: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,'
+First line
+First line
+def
+First line
+Second line
+Third line
+(7, 2)
+<buffer test86.in><buffer >
+baz
+bar
+Second line
+Third line
+foo
index c2bcb6a33c2da2dd0f57d6f1044a5a75bb84cd18..6f3cce0fa02c6591bbf4e913ac1f4c363535d47b 100644 (file)
@@ -444,9 +444,50 @@ EOF
 :       endtry
 :   endfor
 :   call RecVars(oname)
-endtry
 :endfor
 :only
+:"
+:" Test buffer object
+:vnew
+:put ='First line'
+:put ='Second line'
+:put ='Third line'
+:1 delete _
+:py3 b=vim.current.buffer
+:wincmd w
+:mark a
+py3 << EOF
+cb = vim.current.buffer
+# Tests BufferAppend and BufferItem
+cb.append(b[0])
+# Tests BufferSlice and BufferAssSlice
+cb.append('abc') # Will be overwritten
+cb[-1:] = b[:-2]
+# Test BufferLength and BufferAssSlice
+cb.append('def') # Will not be overwritten
+cb[len(cb):] = b[:]
+# Test BufferAssItem and BufferMark
+cb.append('ghi') # Will be overwritten
+cb[-1] = repr((len(cb) - cb.mark('a')[0], cb.mark('a')[1]))
+# Test BufferRepr
+cb.append(repr(cb) + repr(b))
+# Modify foreign buffer
+b.append('foo')
+b[0]='bar'
+b[0:0]=['baz']
+vim.command('call append("$", getbufline(%i, 1, "$"))' % b.number)
+# Test CheckBuffer
+vim.command('bwipeout! ' + str(b.number))
+for expr in ('b[1]','b[:] = ["A", "B"]','b[:]','b.append("abc")'):
+    try:
+        exec(expr)
+    except vim.error:
+        pass
+    else:
+        # Usually a SEGV here
+        # Should not happen in any case
+        cb.append('No exception for ' + expr)
+EOF
 :endfun
 :"
 :call Test()
index 72e7b059fd34aa49e75894b4c43485092a07844b..a43698d16bb810137f4908a6b2cd17d728399bd5 100644 (file)
@@ -295,3 +295,16 @@ bar
   G: '.,,'
   W: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,'
   B: 1:',,' 2:'.,,' 3:'.,,' 4:'.,,'
+First line
+First line
+def
+First line
+Second line
+Third line
+(7, 2)
+<buffer test87.in><buffer >
+baz
+bar
+Second line
+Third line
+foo
index be2138c055f9e11e6239d0c7eb841489ed41bc1d..63476f7bc1f0bfbcf075112c039c028c6442730b 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    943,
 /**/
     942,
 /**/