]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.0016: comparing line pointer for 'breakindent' is not reliable v9.0.0016
authorBram Moolenaar <Bram@vim.org>
Fri, 1 Jul 2022 12:15:35 +0000 (13:15 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 1 Jul 2022 12:15:35 +0000 (13:15 +0100)
Problem:    Comparing line pointer for 'breakindent' is not reliable.
Solution:   Make a copy of the line.

src/indent.c
src/testdir/test_breakindent.vim
src/version.c

index f6cfe4b2f82788792aed63852b15a0c6dea0a7ae..61497eb4f5083d4ff628ac1c36e9919fd5bf185c 100644 (file)
@@ -924,7 +924,8 @@ get_breakindent_win(
 {
     static int     prev_indent = 0;    // cached indent value
     static long            prev_ts     = 0L;   // cached tabstop value
-    static char_u   *prev_line = NULL; // cached pointer to line
+    static int     prev_fnum   = 0;    // cached buffer number
+    static char_u   *prev_line  = NULL;        // cached copy of "line"
     static varnumber_T prev_tick = 0;   // changedtick of cached value
 # ifdef FEAT_VARTABS
     static int      *prev_vts = NULL;   // cached vartabs values
@@ -941,21 +942,28 @@ get_breakindent_win(
                                                ? number_width(wp) + 1 : 0);
 
     // used cached indent, unless
-    // - line pointer changed
+    // - buffer changed
     // - 'tabstop' changed
+    // - buffer was changed
     // - 'briopt_list changed' changed or
     // - 'formatlistpattern' changed
-    if (prev_line != line || prev_ts != wp->w_buffer->b_p_ts
+    // - line changed
+    // - 'vartabs' changed
+    if (prev_fnum != wp->w_buffer->b_fnum
+           || prev_ts != wp->w_buffer->b_p_ts
            || prev_tick != CHANGEDTICK(wp->w_buffer)
            || prev_listopt != wp->w_briopt_list
-           || (prev_flp == NULL
-               || (STRCMP(prev_flp, get_flp_value(wp->w_buffer)) != 0))
+           || prev_flp == NULL
+           || STRCMP(prev_flp, get_flp_value(wp->w_buffer)) != 0
+           || prev_line == NULL || STRCMP(prev_line, line) != 0
 # ifdef FEAT_VARTABS
            || prev_vts != wp->w_buffer->b_p_vts_array
 # endif
        )
     {
-       prev_line = line;
+       prev_fnum = wp->w_buffer->b_fnum;
+       vim_free(prev_line);
+       prev_line = vim_strsave(line);
        prev_ts = wp->w_buffer->b_p_ts;
        prev_tick = CHANGEDTICK(wp->w_buffer);
 # ifdef FEAT_VARTABS
index 6fc4181d65d040df6dd54675486f61990116c8ef..7163f25bd3da4cd866c57cd604ffd71b04e6c0e7 100644 (file)
@@ -716,9 +716,6 @@ func Test_breakindent20_cpo_n_nextpage()
 endfunc
 
 func Test_breakindent20_list()
-  " FIXME - this should not matter
-  call test_override('alloc_lines', 0)
-
   call s:test_windows('setl breakindent breakindentopt= linebreak')
   " default:
   call setline(1, ['  1.  Congress shall make no law',
@@ -802,12 +799,12 @@ func Test_breakindent20_list()
   call s:compare_lines(expect, lines)
   " check formatlistpat indent with different list levels
   let &l:flp = '^\s*\*\+\s\+'
-  redraw!
   %delete _
   call setline(1, ['* Congress shall make no law',
         \ '*** Congress shall make no law',
         \ '**** Congress shall make no law'])
   norm! 1gg
+  redraw!
   let expect = [
        \ "* Congress shall    ",
        \ "  make no law       ",
@@ -835,9 +832,6 @@ func Test_breakindent20_list()
   let lines = s:screen_lines2(1, 6, 20)
   call s:compare_lines(expect, lines)
   call s:close_windows('set breakindent& briopt& linebreak& list& listchars& showbreak&')
-
-  " FIXME - this should not matter
-  call test_override('alloc_lines', 1)
 endfunc
 
 " The following used to crash Vim. This is fixed by 8.2.3391.
@@ -881,9 +875,6 @@ func Test_cursor_position_with_showbreak()
 endfunc
 
 func Test_no_spurious_match()
-  " FIXME - fails under valgrind - this should not matter - timing issue?
-  call test_override('alloc_lines', 0)
-
   let s:input = printf('- y %s y %s', repeat('x', 50), repeat('x', 50))
   call s:test_windows('setl breakindent breakindentopt=list:-1 formatlistpat=^- hls')
   let @/ = '\%>3v[y]'
@@ -893,8 +884,6 @@ func Test_no_spurious_match()
   " cleanup
   set hls&vim
   bwipeout!
-  " FIXME - this should not matter
-  call test_override('alloc_lines', 1)
 endfunc
 
 func Test_no_extra_indent()
index 4e2389eb2f527272739dbd4c8920873309facb77..5b737e1bc68da8c181b3f365a89dbaa76a10a862 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    16,
 /**/
     15,
 /**/