]> granicus.if.org Git - vim/commitdiff
patch 8.0.1133: syntax timeout not used correctly v8.0.1133
authorBram Moolenaar <Bram@vim.org>
Fri, 22 Sep 2017 11:44:56 +0000 (13:44 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 22 Sep 2017 11:44:56 +0000 (13:44 +0200)
Problem:    Syntax timeout not used correctly.
Solution:   Do not pass the timeout to syntax_start() but set it explicitly.
            (Yasuhiro Matsumoto, closes #2139)

src/proto/syntax.pro
src/screen.c
src/syntax.c
src/version.c

index f6ecb8c491bd2ed93b8711f661af092c9fb0a119..966a5cb0a52c34b39402af56f82de5ffc14d4ce6 100644 (file)
@@ -1,5 +1,6 @@
 /* syntax.c */
-void syntax_start(win_T *wp, linenr_T lnum, proftime_T *syntax_tm);
+void syn_set_timeout(proftime_T *tm);
+void syntax_start(win_T *wp, linenr_T lnum);
 void syn_stack_free_all(synblock_T *block);
 void syn_stack_apply_changes(buf_T *buf);
 void syntax_end_parsing(linenr_T lnum);
index 9f39edf04f91d963959d03d9fed27c93bfa29861..fb9241637cb2f478a45b7697d4fd8e3fc27b68c4 100644 (file)
@@ -131,7 +131,7 @@ static void fold_line(win_T *wp, long fold_count, foldinfo_T *foldinfo, linenr_T
 static void fill_foldcolumn(char_u *p, win_T *wp, int closed, linenr_T lnum);
 static void copy_text_attr(int off, char_u *buf, int len, int attr);
 #endif
-static int win_line(win_T *, linenr_T, int, int, int nochange, proftime_T *syntax_tm);
+static int win_line(win_T *, linenr_T, int, int, int nochange);
 static int char_needs_redraw(int off_from, int off_to, int cols);
 static void draw_vsep_win(win_T *wp, int row);
 #ifdef FEAT_STL_OPT
@@ -930,6 +930,7 @@ update_single_line(win_T *wp, linenr_T lnum)
 #ifdef SYN_TIME_LIMIT
        /* Set the time limit to 'redrawtime'. */
        profile_setlimit(p_rdt, &syntax_tm);
+       syn_set_timeout(&syntax_tm);
 #endif
        update_prepare();
 
@@ -944,13 +945,7 @@ update_single_line(win_T *wp, linenr_T lnum)
                start_search_hl();
                prepare_search_hl(wp, lnum);
 # endif
-               win_line(wp, lnum, row, row + wp->w_lines[j].wl_size, FALSE,
-#ifdef SYN_TIME_LIMIT
-                       &syntax_tm
-#else
-                       NULL
-#endif
-                       );
+               win_line(wp, lnum, row, row + wp->w_lines[j].wl_size, FALSE);
 # if defined(FEAT_SEARCH_EXTRA)
                end_search_hl();
 # endif
@@ -960,6 +955,10 @@ update_single_line(win_T *wp, linenr_T lnum)
        }
 
        update_finish();
+
+#ifdef SYN_TIME_LIMIT
+       syn_set_timeout(NULL);
+#endif
     }
     need_cursor_line_redraw = FALSE;
 }
@@ -1805,6 +1804,7 @@ win_update(win_T *wp)
 #ifdef SYN_TIME_LIMIT
     /* Set the time limit to 'redrawtime'. */
     profile_setlimit(p_rdt, &syntax_tm);
+    syn_set_timeout(&syntax_tm);
 #endif
 #ifdef FEAT_FOLDING
     win_foldinfo.fi_level = 0;
@@ -2109,13 +2109,7 @@ win_update(win_T *wp)
                /*
                 * Display one line.
                 */
-               row = win_line(wp, lnum, srow, wp->w_height, mod_top == 0,
-#ifdef SYN_TIME_LIMIT
-                       &syntax_tm
-#else
-                       NULL
-#endif
-                       );
+               row = win_line(wp, lnum, srow, wp->w_height, mod_top == 0);
 
 #ifdef FEAT_FOLDING
                wp->w_lines[idx].wl_folded = FALSE;
@@ -2275,6 +2269,10 @@ win_update(win_T *wp)
        win_draw_end(wp, '~', ' ', row, wp->w_height, HLF_EOB);
     }
 
+#ifdef SYN_TIME_LIMIT
+    syn_set_timeout(NULL);
+#endif
+
     /* Reset the type of redrawing required, the window has been updated. */
     wp->w_redr_type = 0;
 #ifdef FEAT_DIFF
@@ -3000,8 +2998,7 @@ win_line(
     linenr_T   lnum,
     int                startrow,
     int                endrow,
-    int                nochange UNUSED,        /* not updating for changed text */
-    proftime_T *syntax_tm UNUSED)
+    int                nochange UNUSED)        /* not updating for changed text */
 {
     int                col = 0;                /* visual column on screen */
     unsigned   off;                    /* offset in ScreenLines/ScreenAttrs */
@@ -3216,7 +3213,7 @@ win_line(
         * error, stop syntax highlighting. */
        save_did_emsg = did_emsg;
        did_emsg = FALSE;
-       syntax_start(wp, lnum, syntax_tm);
+       syntax_start(wp, lnum);
        if (did_emsg)
            wp->w_s->b_syn_error = TRUE;
        else
@@ -3614,7 +3611,7 @@ win_line(
 # ifdef FEAT_SYN_HL
            /* Need to restart syntax highlighting for this line. */
            if (has_syntax)
-               syntax_start(wp, lnum, syntax_tm);
+               syntax_start(wp, lnum);
 # endif
        }
 #endif
index 6361bd7aafa2cf3b1c233f25ea38ace2f9578d7f..d9a7b4fd8c74744df99b45d6d31cfdbb9fd7327a 100644 (file)
@@ -368,7 +368,7 @@ static win_T        *syn_win;               /* current window for highlighting */
 static buf_T   *syn_buf;               /* current buffer for highlighting */
 static synblock_T *syn_block;          /* current buffer for highlighting */
 #ifdef FEAT_RELTIME
-static proftime_T *syn_tm;
+static proftime_T *syn_tm;             /* timeout limit */
 #endif
 static linenr_T current_lnum = 0;      /* lnum of current state */
 static colnr_T current_col = 0;        /* column of current state */
@@ -489,6 +489,18 @@ static int get_id_list(char_u **arg, int keylen, short **list, int skip);
 static void syn_combine_list(short **clstr1, short **clstr2, int list_op);
 static void syn_incl_toplevel(int id, int *flagsp);
 
+#if defined(FEAT_RELTIME) || defined(PROTO)
+/*
+ * Set the timeout used for syntax highlighting.
+ * Use NULL to reset, no timeout.
+ */
+    void
+syn_set_timeout(proftime_T *tm)
+{
+    syn_tm = tm;
+}
+#endif
+
 /*
  * Start the syntax recognition for a line.  This function is normally called
  * from the screen updating, once for each displayed line.
@@ -497,7 +509,7 @@ static void syn_incl_toplevel(int id, int *flagsp);
  * window.
  */
     void
-syntax_start(win_T *wp, linenr_T lnum, proftime_T *syntax_tm UNUSED)
+syntax_start(win_T *wp, linenr_T lnum)
 {
     synstate_T *p;
     synstate_T *last_valid = NULL;
@@ -527,9 +539,6 @@ syntax_start(win_T *wp, linenr_T lnum, proftime_T *syntax_tm UNUSED)
     }
     changedtick = CHANGEDTICK(syn_buf);
     syn_win = wp;
-#ifdef FEAT_RELTIME
-    syn_tm = syntax_tm;
-#endif
 
     /*
      * Allocate syntax stack when needed.
@@ -6569,7 +6578,7 @@ syn_get_id(
     if (wp->w_buffer != syn_buf
            || lnum != current_lnum
            || col < current_col)
-       syntax_start(wp, lnum, NULL);
+       syntax_start(wp, lnum);
     else if (wp->w_buffer == syn_buf
            && lnum == current_lnum
            && col > current_col)
@@ -6645,7 +6654,7 @@ syn_get_foldlevel(win_T *wp, long lnum)
 # endif
            )
     {
-       syntax_start(wp, lnum, NULL);
+       syntax_start(wp, lnum);
 
        for (i = 0; i < current_state.ga_len; ++i)
            if (CUR_STATE(i).si_flags & HL_FOLD)
@@ -7006,7 +7015,7 @@ static char *(highlight_init_light[]) = {
     CENT("ToolbarLine term=underline ctermbg=LightGrey",
         "ToolbarLine term=underline ctermbg=LightGrey guibg=LightGrey"),
     CENT("ToolbarButton cterm=bold ctermfg=White ctermbg=DarkGrey",
-        "ToolbarButton cterm=bold ctermfg=White ctermbg=DarkGrey gui=bold guifg=White guibg=DarkGrey"),
+        "ToolbarButton cterm=bold ctermfg=White ctermbg=DarkGrey gui=bold guifg=White guibg=Grey40"),
 #endif
     NULL
 };
@@ -7102,7 +7111,7 @@ static char *(highlight_init_dark[]) = {
 #endif
 #ifdef FEAT_MENU
     CENT("ToolbarLine term=underline ctermbg=DarkGrey",
-        "ToolbarLine term=underline ctermbg=DarkGrey guibg=DarkGrey"),
+        "ToolbarLine term=underline ctermbg=DarkGrey guibg=Grey50"),
     CENT("ToolbarButton cterm=bold ctermfg=Black ctermbg=LightGrey",
         "ToolbarButton cterm=bold ctermfg=Black ctermbg=LightGrey gui=bold guifg=Black guibg=LightGrey"),
 #endif
index b90665e51f43b40a2c554206c2f40e52cab3236b..8901bb5965cdb90053e623898548d9a828b4585a 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1133,
 /**/
     1132,
 /**/