home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / unreleased / patches / old / 5.4p.5 < prev    next >
Encoding:
Internet Message Format  |  1999-07-19  |  4.7 KB

  1. To: vim-dev@vim.org
  2. Subject: patch 5.4p.5
  3. Fcc: outbox
  4. From: Bram Moolenaar <Bram@moolenaar.net>
  5. ------------
  6.  
  7. Another nasty autocommand problem.  It appears more people are using
  8. autocommands these days.  It requires a radical change to how autocommands are
  9. executed.  But not right now.
  10.  
  11.  
  12. Patch 5.4p.5
  13. Problem:    When changing buffers in a BufDelete autocommand, there could be
  14.             ml_line errors and/or a crash. (Schandl)  Was caused by deleting
  15.             the current buffer.
  16. Solution:   When the buffer to be deleted unexpectedly becomes the current
  17.             buffer, don't delete it.
  18.             Also added a check for this in test13.
  19. Files:      src/buffer.c, src/testdir/test13.in, src/testdir/test13.ok
  20.  
  21.  
  22. *** ../vim-5.4p/src/buffer.c    Mon Jul 19 11:08:56 1999
  23. --- src/buffer.c    Tue Jul 20 13:17:13 1999
  24. ***************
  25. *** 185,190 ****
  26. --- 185,194 ----
  27.       int        free_buf;
  28.       int        del_buf;
  29.   {
  30. + #ifdef AUTOCMD
  31. +     int        is_curbuf;
  32. + #endif
  33.       if (buf->b_nwindows > 0)
  34.       --buf->b_nwindows;
  35.       if (buf->b_nwindows == 0 && win != NULL)
  36. ***************
  37. *** 218,226 ****
  38.        * Free all things allocated for this buffer.
  39.        * Also calls the "BufDelete" autocommands when del_buf is TRUE.
  40.        */
  41.       buf_freeall(buf, del_buf);
  42. !     if (!buf_valid(buf))        /* autocommands may delete the buffer */
  43.       return;
  44.   
  45.       /*
  46.        * Remove the buffer from the list.
  47. --- 222,242 ----
  48.        * Free all things allocated for this buffer.
  49.        * Also calls the "BufDelete" autocommands when del_buf is TRUE.
  50.        */
  51. + #ifdef AUTOCMD
  52. +     is_curbuf = (buf == curbuf);
  53. + #endif
  54.       buf_freeall(buf, del_buf);
  55. ! #ifdef AUTOCMD
  56. !     /*
  57. !      * Autocommands may have deleted the buffer.
  58. !      * It's possible that autocommands change curbuf to the one being deleted.
  59. !      * This might cause curbuf to be deleted unexpectedly.  But in some cases
  60. !      * it's OK to delete the curbuf, because a new one is obtained anyway.
  61. !      * Therefore only return if curbuf changed to the deleted buffer.
  62. !      */
  63. !     if (!buf_valid(buf) || (buf == curbuf && !is_curbuf))
  64.       return;
  65. + #endif
  66.   
  67.       /*
  68.        * Remove the buffer from the list.
  69. ***************
  70. *** 267,276 ****
  71.   /*ARGSUSED*/
  72.       void
  73.   buf_freeall(buf, del_buf)
  74. !     BUF        *buf;
  75. !     int        del_buf;    /* buffer is going to be deleted */
  76.   {
  77.   #ifdef AUTOCMD
  78.       apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, FALSE, buf);
  79.       if (!buf_valid(buf))        /* autocommands may delete the buffer */
  80.       return;
  81. --- 283,294 ----
  82.   /*ARGSUSED*/
  83.       void
  84.   buf_freeall(buf, del_buf)
  85. !     BUF        *buf;
  86. !     int        del_buf;    /* buffer is going to be deleted */
  87.   {
  88.   #ifdef AUTOCMD
  89. +     int        is_curbuf = (buf == curbuf);
  90.       apply_autocmds(EVENT_BUFUNLOAD, buf->b_fname, buf->b_fname, FALSE, buf);
  91.       if (!buf_valid(buf))        /* autocommands may delete the buffer */
  92.       return;
  93. ***************
  94. *** 280,285 ****
  95. --- 298,311 ----
  96.       if (!buf_valid(buf))        /* autocommands may delete the buffer */
  97.           return;
  98.       }
  99. +     /*
  100. +      * It's possible that autocommands change curbuf to the one being deleted.
  101. +      * This might cause curbuf to be deleted unexpectedly.  But in some cases
  102. +      * it's OK to delete the curbuf, because a new one is obtained anyway.
  103. +      * Therefore only return if curbuf changed to the deleted buffer.
  104. +      */
  105. +     if (buf == curbuf && !is_curbuf)
  106. +     return;
  107.   #endif
  108.   #ifdef HAVE_TCL
  109.       tcl_buffer_free(buf);
  110. *** ../vim-5.4p/src/testdir/test13.in    Mon Jul 19 11:08:50 1999
  111. --- src/testdir/test13.in    Tue Jul 20 13:31:27 1999
  112. ***************
  113. *** 7,12 ****
  114. --- 7,15 ----
  115.   Also test deleting the buffer on a Unload event.  If this goes wrong there
  116.   will be the ATTENTION prompt.
  117.   
  118. + Also test changing buffers in a BufDel autocommand.  If this goes wrong there
  119. + are ml_line errors and/or a Crash.
  120.   STARTTEST
  121.   :/^start of testfile/,/^end of testfile/w! Xtestje1
  122.   :/^start of testfile/,/^end of testfile/w! Xtestje2
  123. ***************
  124. *** 36,41 ****
  125. --- 39,51 ----
  126.   :e Xtestje2
  127.   :sp Xtestje1
  128.   :e
  129. + :w >>test.out
  130. + :au!
  131. + :only
  132. + :e Xtestje1
  133. + :bdel Xtestje2 Xtestje3 test.out test13.in
  134. + :au BufDelete Xtestje1 buf Xtestje1
  135. + :bd
  136.   :w >>test.out
  137.   :!rm -rf Xtestje*
  138.   :qa!
  139. *** ../vim-5.4p/src/testdir/test13.ok    Mon Jul 19 11:08:50 1999
  140. --- src/testdir/test13.ok    Tue Jul 20 13:35:40 1999
  141. ***************
  142. *** 22,24 ****
  143. --- 22,30 ----
  144.       contents
  145.       contents
  146.   end of testfile
  147. + start of testfile
  148. + testje1
  149. +     contents
  150. +     contents
  151. +     contents
  152. + end of testfile
  153.  
  154. --
  155. hundred-and-one symptoms of being an internet addict:
  156. 174. You know what a listserv is.
  157.  
  158. --/-/---- Bram Moolenaar ---- Bram@moolenaar.net ---- Bram@vim.org ---\-\--
  159.   \ \    www.vim.org/iccf      www.moolenaar.net       www.vim.org    / /
  160.