Blob Blame History Raw
To: vim-dev@vim.org
Subject: Patch 7.0.044
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------

Patch 7.0.044
Problem:    Perl: setting a buffer line in another buffer may result in
	    changing the current buffer.
Solution:   Properly change to the buffer to be changed.
Files:	    src/if_perl.xs


*** ../vim-7.0.043/src/if_perl.xs	Tue Mar  7 00:18:16 2006
--- src/if_perl.xs	Thu Jun 22 21:22:18 2006
***************
*** 1056,1062 ****
      int i;
      long lnum;
      char *line;
-     buf_T *savebuf;
      PPCODE:
      if (buf_valid(vimbuf))
      {
--- 1056,1061 ----
***************
*** 1069,1082 ****
  	    line = SvPV(ST(i),PL_na);
  	    if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
  	    {
! 		savebuf = curbuf;
  		curbuf = vimbuf;
  		if (u_savesub(lnum) == OK)
  		{
  		    ml_replace(lnum, (char_u *)line, TRUE);
  		    changed_bytes(lnum, 0);
  		}
! 		curbuf = savebuf;
  	    }
  	}
      }
--- 1068,1098 ----
  	    line = SvPV(ST(i),PL_na);
  	    if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
  	    {
!     #ifdef FEAT_AUTOCMD
! 		aco_save_T	aco;
! 
! 		/* set curwin/curbuf for "vimbuf" and save some things */
! 		aucmd_prepbuf(&aco, vimbuf);
!     #else
! 		buf_T	*save_curbuf = curbuf;
! 
  		curbuf = vimbuf;
+ 		curwin->w_buffer = vimbuf;
+     #endif
  		if (u_savesub(lnum) == OK)
  		{
  		    ml_replace(lnum, (char_u *)line, TRUE);
  		    changed_bytes(lnum, 0);
  		}
! 
!     #ifdef FEAT_AUTOCMD
! 		/* restore curwin/curbuf and a few other things */
! 		aucmd_restbuf(&aco);
! 		/* Careful: autocommands may have made "vimbuf" invalid! */
!     #else
! 		curwin->w_buffer = save_curbuf;
! 		curbuf = save_curbuf;
!     #endif
  	    }
  	}
      }
***************
*** 1087,1093 ****
  
      PREINIT:
      long i, lnum = 0, count = 0;
-     buf_T *savebuf;
      PPCODE:
      if (buf_valid(vimbuf))
      {
--- 1103,1108 ----
***************
*** 1114,1129 ****
  	    {
  		if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count)
  		{
! 		    savebuf = curbuf;
  		    curbuf = vimbuf;
  		    if (u_savedel(lnum, 1) == OK)
  		    {
  			ml_delete(lnum, 0);
  			deleted_lines_mark(lnum, 1L);
! 			if (savebuf == curbuf)
  			    check_cursor();
  		    }
! 		    curbuf = savebuf;
  		    update_curbuf(VALID);
  		}
  	    }
--- 1129,1159 ----
  	    {
  		if (lnum > 0 && lnum <= vimbuf->b_ml.ml_line_count)
  		{
! 		    buf_T	*save_curbuf = curbuf;
!     #ifdef FEAT_AUTOCMD
! 		    aco_save_T	aco;
! 
! 		    /* set curwin/curbuf for "vimbuf" and save some things */
! 		    aucmd_prepbuf(&aco, vimbuf);
!     #else
  		    curbuf = vimbuf;
+ 		    curwin->w_buffer = vimbuf;
+     #endif
  		    if (u_savedel(lnum, 1) == OK)
  		    {
  			ml_delete(lnum, 0);
  			deleted_lines_mark(lnum, 1L);
! 			if (save_curbuf == curbuf)
  			    check_cursor();
  		    }
!     #ifdef FEAT_AUTOCMD
! 		    /* restore curwin/curbuf and a few other things */
! 		    aucmd_restbuf(&aco);
! 		    /* Careful: autocommands may have made "vimbuf" invalid! */
!     #else
! 		    curwin->w_buffer = save_curbuf;
! 		    curbuf = save_curbuf;
!     #endif
  		    update_curbuf(VALID);
  		}
  	    }
***************
*** 1138,1144 ****
      int		i;
      long	lnum;
      char	*line;
-     buf_T	*savebuf;
      PPCODE:
      if (buf_valid(vimbuf))
      {
--- 1168,1173 ----
***************
*** 1151,1164 ****
  	    line = SvPV(ST(i),PL_na);
  	    if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
  	    {
! 		savebuf = curbuf;
  		curbuf = vimbuf;
  		if (u_inssub(lnum + 1) == OK)
  		{
  		    ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE);
  		    appended_lines_mark(lnum, 1L);
  		}
! 		curbuf = savebuf;
  		update_curbuf(VALID);
  	    }
  	}
--- 1180,1210 ----
  	    line = SvPV(ST(i),PL_na);
  	    if (lnum >= 0 && lnum <= vimbuf->b_ml.ml_line_count && line != NULL)
  	    {
!     #ifdef FEAT_AUTOCMD
! 		aco_save_T	aco;
! 
! 		/* set curwin/curbuf for "vimbuf" and save some things */
! 		aucmd_prepbuf(&aco, vimbuf);
!     #else
! 		buf_T	*save_curbuf = curbuf;
! 
  		curbuf = vimbuf;
+ 		curwin->w_buffer = vimbuf;
+     #endif
  		if (u_inssub(lnum + 1) == OK)
  		{
  		    ml_append(lnum, (char_u *)line, (colnr_T)0, FALSE);
  		    appended_lines_mark(lnum, 1L);
  		}
! 
!     #ifdef FEAT_AUTOCMD
! 		/* restore curwin/curbuf and a few other things */
! 		aucmd_restbuf(&aco);
! 		/* Careful: autocommands may have made "vimbuf" invalid! */
!     #else
! 		curwin->w_buffer = save_curbuf;
! 		curbuf = save_curbuf;
!     #endif
  		update_curbuf(VALID);
  	    }
  	}
*** ../vim-7.0.043/src/version.c	Tue Aug  8 16:30:51 2006
--- src/version.c	Tue Aug  8 16:45:40 2006
***************
*** 668,669 ****
--- 668,671 ----
  {   /* Add new patch number below this line */
+ /**/
+     44,
  /**/

-- 
Momento mori, ergo carpe diem

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///