| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.943 |
| 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.943 |
| Problem: Python: Negative indices were failing. |
| Solution: Fix negative indices. Add tests. (ZyX) |
| Files: 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 |
| |
| |
| |
| |
| |
| *** 2394,2399 **** |
| --- 2394,2402 ---- |
| 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,2446 **** |
| --- 2444,2452 ---- |
| 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")); |
| |
| |
| |
| *** 1114,1120 **** |
| return NULL; |
| |
| if (PySlice_GetIndicesEx((PyObject *)idx, |
| ! (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1, |
| &start, &stop, |
| &step, &slicelen) < 0) |
| { |
| --- 1114,1120 ---- |
| return NULL; |
| |
| if (PySlice_GetIndicesEx((PyObject *)idx, |
| ! (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count, |
| &start, &stop, |
| &step, &slicelen) < 0) |
| { |
| |
| *** 1146,1152 **** |
| return -1; |
| |
| if (PySlice_GetIndicesEx((PyObject *)idx, |
| ! (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1, |
| &start, &stop, |
| &step, &slicelen) < 0) |
| { |
| --- 1146,1152 ---- |
| return -1; |
| |
| if (PySlice_GetIndicesEx((PyObject *)idx, |
| ! (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count, |
| &start, &stop, |
| &step, &slicelen) < 0) |
| { |
| |
| |
| |
| *** 475,483 **** |
| : endtry |
| : endfor |
| : call RecVars(oname) |
| - endtry |
| :endfor |
| :only |
| :endfun |
| :" |
| :call Test() |
| --- 475,524 ---- |
| : endtry |
| : endfor |
| : call RecVars(oname) |
| :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() |
| |
| |
| |
| *** 306,308 **** |
| --- 306,321 ---- |
| 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 |
| |
| |
| |
| *** 444,452 **** |
| : endtry |
| : endfor |
| : call RecVars(oname) |
| - endtry |
| :endfor |
| :only |
| :endfun |
| :" |
| :call Test() |
| --- 444,493 ---- |
| : endtry |
| : endfor |
| : call RecVars(oname) |
| :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() |
| |
| |
| |
| *** 295,297 **** |
| --- 295,310 ---- |
| 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 |
| |
| |
| |
| *** 730,731 **** |
| --- 730,733 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 943, |
| /**/ |
| |
| -- |
| Q: Is selling software the same as selling hardware? |
| A: No, good hardware is sold new, good software has already been used by many. |
| |
| /// 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 /// |