components/vim/vim72-patches/7.2.445
changeset 379 c6a17bba1da3
parent 378 f0b61ed1d10d
child 380 e92b3b4a1c66
--- a/components/vim/vim72-patches/7.2.445	Thu Jul 07 19:05:29 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,261 +0,0 @@
-To: [email protected]
-Subject: Patch 7.2.445
-Fcc: outbox
-From: Bram Moolenaar <[email protected]>
-Mime-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-------------
-
-Patch 7.2.445
-Problem:    Crash when using undo/redo and a FileChangedRO autocmd event that
-	    reloads the buffer. (Dominique Pelle)
-Solution:   Do not allow autocommands while performing and undo or redo.
-Files:	    src/misc1.c, src/undo.c
-
-
-*** ../vim-7.2.444/src/misc1.c	2010-03-23 18:22:40.000000000 +0100
---- src/misc1.c	2010-07-07 18:18:52.000000000 +0200
-***************
-*** 2467,2476 ****
-  }
-  
-  /*
-!  * changed() is called when something in the current buffer is changed.
-   *
-   * Most often called through changed_bytes() and changed_lines(), which also
-   * mark the area of the display to be redrawn.
-   */
-      void
-  changed()
---- 2467,2478 ----
-  }
-  
-  /*
-!  * Call this function when something in the current buffer is changed.
-   *
-   * Most often called through changed_bytes() and changed_lines(), which also
-   * mark the area of the display to be redrawn.
-+  *
-+  * Careful: may trigger autocommands that reload the buffer.
-   */
-      void
-  changed()
-***************
-*** 2536,2541 ****
---- 2538,2544 ----
-   * - marks the windows on this buffer to be redisplayed
-   * - marks the buffer changed by calling changed()
-   * - invalidates cached values
-+  * Careful: may trigger autocommands that reload the buffer.
-   */
-      void
-  changed_bytes(lnum, col)
-***************
-*** 2649,2654 ****
---- 2652,2658 ----
-   * below the changed lines (BEFORE the change).
-   * When only inserting lines, "lnum" and "lnume" are equal.
-   * Takes care of calling changed() and updating b_mod_*.
-+  * Careful: may trigger autocommands that reload the buffer.
-   */
-      void
-  changed_lines(lnum, col, lnume, xtra)
-***************
-*** 2716,2721 ****
---- 2720,2730 ----
-      }
-  }
-  
-+ /*
-+  * Common code for when a change is was made.
-+  * See changed_lines() for the arguments.
-+  * Careful: may trigger autocommands that reload the buffer.
-+  */
-      static void
-  changed_common(lnum, col, lnume, xtra)
-      linenr_T	lnum;
-***************
-*** 2966,2971 ****
---- 2975,2981 ----
-   * Don't use emsg(), because it flushes the macro buffer.
-   * If we have undone all changes b_changed will be FALSE, but "b_did_warn"
-   * will be TRUE.
-+  * Careful: may trigger autocommands that reload the buffer.
-   */
-      void
-  change_warning(col)
-*** ../vim-7.2.444/src/undo.c	2010-05-30 16:55:17.000000000 +0200
---- src/undo.c	2010-07-07 18:14:44.000000000 +0200
-***************
-*** 185,191 ****
-      }
-  }
-  
-!     void
-  u_check(int newhead_may_be_NULL)
-  {
-      seen_b_u_newhead = 0;
---- 185,191 ----
-      }
-  }
-  
-!     static void
-  u_check(int newhead_may_be_NULL)
-  {
-      seen_b_u_newhead = 0;
-***************
-*** 320,325 ****
---- 320,328 ----
-      return TRUE;
-  }
-  
-+ /*
-+  * Common code for various ways to save text before a change.
-+  */
-      static int
-  u_savecommon(top, bot, newbot)
-      linenr_T	top, bot;
-***************
-*** 374,380 ****
-      size = bot - top - 1;
-  
-      /*
-!      * if curbuf->b_u_synced == TRUE make a new header
-       */
-      if (curbuf->b_u_synced)
-      {
---- 377,383 ----
-      size = bot - top - 1;
-  
-      /*
-!      * If curbuf->b_u_synced == TRUE make a new header.
-       */
-      if (curbuf->b_u_synced)
-      {
-***************
-*** 709,714 ****
---- 712,723 ----
-  	u_oldcount = -1;
-      while (count--)
-      {
-+ 	/* Do the change warning now, so that it triggers FileChangedRO when
-+ 	 * needed.  This may cause the file to be reloaded, that must happen
-+ 	 * before we do anything, because it may change curbuf->b_u_curhead
-+ 	 * and more. */
-+ 	change_warning(0);
-+ 
-  	if (undo_undoes)
-  	{
-  	    if (curbuf->b_u_curhead == NULL)		/* first undo */
-***************
-*** 952,959 ****
-  	/*
-  	 * First go up the tree as much as needed.
-  	 */
-! 	for (;;)
-  	{
-  	    uhp = curbuf->b_u_curhead;
-  	    if (uhp == NULL)
-  		uhp = curbuf->b_u_newhead;
---- 961,971 ----
-  	/*
-  	 * First go up the tree as much as needed.
-  	 */
-! 	while (!got_int)
-  	{
-+ 	    /* Do the change warning now, for the same reason as above. */
-+ 	    change_warning(0);
-+ 
-  	    uhp = curbuf->b_u_curhead;
-  	    if (uhp == NULL)
-  		uhp = curbuf->b_u_newhead;
-***************
-*** 970,978 ****
-  	/*
-  	 * And now go down the tree (redo), branching off where needed.
-  	 */
-! 	uhp = curbuf->b_u_curhead;
-! 	while (uhp != NULL)
-  	{
-  	    /* Go back to the first branch with a mark. */
-  	    while (uhp->uh_alt_prev != NULL
-  					&& uhp->uh_alt_prev->uh_walk == mark)
---- 982,996 ----
-  	/*
-  	 * And now go down the tree (redo), branching off where needed.
-  	 */
-! 	while (!got_int)
-  	{
-+ 	    /* Do the change warning now, for the same reason as above. */
-+ 	    change_warning(0);
-+ 
-+ 	    uhp = curbuf->b_u_curhead;
-+ 	    if (uhp == NULL)
-+ 		break;
-+ 
-  	    /* Go back to the first branch with a mark. */
-  	    while (uhp->uh_alt_prev != NULL
-  					&& uhp->uh_alt_prev->uh_walk == mark)
-***************
-*** 1070,1075 ****
---- 1088,1099 ----
-      int		empty_buffer;		    /* buffer became empty */
-      u_header_T	*curhead = curbuf->b_u_curhead;
-  
-+ #ifdef FEAT_AUTOCMD
-+     /* Don't want autocommands using the undo structures here, they are
-+      * invalid till the end. */
-+     block_autocmds();
-+ #endif
-+ 
-  #ifdef U_DEBUG
-      u_check(FALSE);
-  #endif
-***************
-*** 1099,1104 ****
---- 1123,1131 ----
-  	if (top > curbuf->b_ml.ml_line_count || top >= bot
-  				      || bot > curbuf->b_ml.ml_line_count + 1)
-  	{
-+ #ifdef FEAT_AUTOCMD
-+ 	    unblock_autocmds();
-+ #endif
-  	    EMSG(_("E438: u_undo: line numbers wrong"));
-  	    changed();		/* don't want UNCHANGED now */
-  	    return;
-***************
-*** 1304,1309 ****
---- 1331,1340 ----
-      /* The timestamp can be the same for multiple changes, just use the one of
-       * the undone/redone change. */
-      curbuf->b_u_seq_time = curhead->uh_time;
-+ 
-+ #ifdef FEAT_AUTOCMD
-+     unblock_autocmds();
-+ #endif
-  #ifdef U_DEBUG
-      u_check(FALSE);
-  #endif
-*** ../vim-7.2.444/src/version.c	2010-06-13 02:35:41.000000000 +0200
---- src/version.c	2010-07-07 18:18:27.000000000 +0200
-***************
-*** 683,684 ****
---- 683,686 ----
-  {   /* Add new patch number below this line */
-+ /**/
-+     445,
-  /**/
-
--- 
-    A KNIGHT rides into shot and hacks him to the ground.  He rides off.
-    We stay for a moment on the glade.  A MIDDLE-AGED LADY in a C. & A.
-    twin-set emerges from the trees and looks in horror at the body of her
-    HUSBAND.
-MRS HISTORIAN: FRANK!
-                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
-
- /// Bram Moolenaar -- [email protected] -- 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    ///