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


*** ../vim-7.3.942/src/if_py_both.h     2013-05-12 20:36:09.000000000 +0200
--- src/if_py_both.h    2013-05-12 21:10:03.000000000 +0200
***************
*** 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"));
*** ../vim-7.3.942/src/if_python3.c     2013-05-12 20:36:09.000000000 +0200
--- src/if_python3.c    2013-05-12 21:10:03.000000000 +0200
***************
*** 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)
        {
*** ../vim-7.3.942/src/testdir/test86.in        2013-05-06 03:52:44.000000000 
+0200
--- src/testdir/test86.in       2013-05-12 21:11:43.000000000 +0200
***************
*** 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()
*** ../vim-7.3.942/src/testdir/test86.ok        2013-05-06 03:52:44.000000000 
+0200
--- src/testdir/test86.ok       2013-05-12 21:11:43.000000000 +0200
***************
*** 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
*** ../vim-7.3.942/src/testdir/test87.in        2013-05-06 03:52:44.000000000 
+0200
--- src/testdir/test87.in       2013-05-12 21:11:43.000000000 +0200
***************
*** 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()
*** ../vim-7.3.942/src/testdir/test87.ok        2013-05-06 03:52:44.000000000 
+0200
--- src/testdir/test87.ok       2013-05-12 21:11:43.000000000 +0200
***************
*** 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
*** ../vim-7.3.942/src/version.c        2013-05-12 20:36:09.000000000 +0200
--- src/version.c       2013-05-12 21:11:53.000000000 +0200
***************
*** 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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Raspunde prin e-mail lui