aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-04-16 02:03:07 -0400
committerJan Edmund Lazo <jan.lazo@mail.utoronto.ca>2019-04-23 00:03:48 -0400
commit6dacfe7217096df8c389a50754a3f0cbc615eefb (patch)
tree1bc6837afaf9e980987a08924a76b35a15bf6854
parentb8128aee02e831267b63c3a52f5e5e6d38ae8308 (diff)
downloadrneovim-6dacfe7217096df8c389a50754a3f0cbc615eefb.tar.gz
rneovim-6dacfe7217096df8c389a50754a3f0cbc615eefb.tar.bz2
rneovim-6dacfe7217096df8c389a50754a3f0cbc615eefb.zip
vim-patch:8.0.1133: syntax timeout not used correctly
Problem: Syntax timeout not used correctly. Solution: Do not pass the timeout to syntax_start() but set it explicitly. (Yasuhiro Matsumoto, closes vim/vim#2139) https://github.com/vim/vim/commit/f3d769a585040ac47f7054057758809024ef6377
-rw-r--r--src/nvim/screen.c15
-rw-r--r--src/nvim/syntax.c16
2 files changed, 17 insertions, 14 deletions
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index 38fc1ee021..6d4a5dee3a 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -1137,6 +1137,7 @@ static void win_update(win_T *wp)
got_int = 0;
// Set the time limit to 'redrawtime'.
proftime_T syntax_tm = profile_setlimit(p_rdt);
+ syn_set_timeout(&syntax_tm);
win_foldinfo.fi_level = 0;
/*
@@ -1364,8 +1365,7 @@ static void win_update(win_T *wp)
/*
* Display one line.
*/
- row = win_line(wp, lnum, srow, wp->w_grid.Rows, mod_top == 0, false,
- &syntax_tm);
+ row = win_line(wp, lnum, srow, wp->w_grid.Rows, mod_top == 0, false);
wp->w_lines[idx].wl_folded = FALSE;
wp->w_lines[idx].wl_lastlnum = lnum;
@@ -1396,8 +1396,7 @@ static void win_update(win_T *wp)
if (fold_count != 0) {
fold_line(wp, fold_count, &win_foldinfo, lnum, row);
} else {
- (void)win_line(wp, lnum, srow, wp->w_grid.Rows, true, true,
- &syntax_tm);
+ (void)win_line(wp, lnum, srow, wp->w_grid.Rows, true, true);
}
}
@@ -1497,6 +1496,7 @@ static void win_update(win_T *wp)
if (wp->w_redr_type >= REDRAW_TOP) {
draw_vsep_win(wp, 0);
}
+ syn_set_timeout(NULL);
/* Reset the type of redrawing required, the window has been updated. */
wp->w_redr_type = 0;
@@ -2045,8 +2045,7 @@ win_line (
int startrow,
int endrow,
bool nochange, // not updating for changed text
- bool number_only, // only update the number column
- proftime_T *syntax_tm
+ bool number_only // only update the number column
)
{
int c = 0; // init for GCC
@@ -2199,7 +2198,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 {
@@ -2548,7 +2547,7 @@ win_line (
// Need to restart syntax highlighting for this line.
if (has_syntax) {
- syntax_start(wp, lnum, syntax_tm);
+ syntax_start(wp, lnum);
}
}
}
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 543c131b58..ed95cdbebb 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -359,7 +359,7 @@ static reg_extmatch_T *next_match_extmatch = NULL;
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
-static proftime_T *syn_tm;
+static proftime_T *syn_tm; // timeout limit
static linenr_T current_lnum = 0; // lnum of current state
static colnr_T current_col = 0; // column of current state
static int current_state_stored = 0; // TRUE if stored current state
@@ -376,7 +376,12 @@ static int current_line_id = 0; // unique number for current line
static int syn_time_on = FALSE;
# define IF_SYN_TIME(p) (p)
-
+// Set the timeout used for syntax highlighting.
+// Use NULL to reset, no timeout.
+void syn_set_timeout(proftime_T *tm)
+{
+ syn_tm = tm;
+}
/*
* Start the syntax recognition for a line. This function is normally called
@@ -385,7 +390,7 @@ static int syn_time_on = FALSE;
* it. Careful: curbuf and curwin are likely to point to another buffer and
* window.
*/
-void syntax_start(win_T *wp, linenr_T lnum, proftime_T *syntax_tm)
+void syntax_start(win_T *wp, linenr_T lnum)
{
synstate_T *p;
synstate_T *last_valid = NULL;
@@ -412,7 +417,6 @@ void syntax_start(win_T *wp, linenr_T lnum, proftime_T *syntax_tm)
}
changedtick = buf_get_changedtick(syn_buf);
syn_win = wp;
- syn_tm = syntax_tm;
/*
* Allocate syntax stack when needed.
@@ -5690,7 +5694,7 @@ int syn_get_id(
// When the position is not after the current position and in the same
// line of the same buffer, need to restart parsing.
if (wp->w_buffer != syn_buf || lnum != current_lnum || col < current_col) {
- syntax_start(wp, lnum, NULL);
+ syntax_start(wp, lnum);
} else if (col > current_col) {
// next_match may not be correct when moving around, e.g. with the
// "skip" expression in searchpair()
@@ -5768,7 +5772,7 @@ int syn_get_foldlevel(win_T *wp, long lnum)
if (wp->w_s->b_syn_folditems != 0
&& !wp->w_s->b_syn_error
&& !wp->w_s->b_syn_slow) {
- syntax_start(wp, lnum, NULL);
+ syntax_start(wp, lnum);
for (int i = 0; i < current_state.ga_len; ++i) {
if (CUR_STATE(i).si_flags & HL_FOLD) {