diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-08-26 21:33:04 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-08-26 21:33:04 +0100 |
commit | 0f618386367ba9388e1f50bc665bc1add6c01567 (patch) | |
tree | 577ff6e6e4901d1a7e988d16db0c22d74c404866 /src/regexp.c | |
parent | 58dcbf1c6586d3873702e035b47829178a91250e (diff) | |
download | vim-git-0f618386367ba9388e1f50bc665bc1add6c01567.tar.gz |
patch 9.0.0282: a nested timout stops the previous timeoutv9.0.0282
Problem: A nested timout stops the previous timeout.
Solution: Ignore any nested timeout.
Diffstat (limited to 'src/regexp.c')
-rw-r--r-- | src/regexp.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/regexp.c b/src/regexp.c index bec046437..8e6e9c440 100644 --- a/src/regexp.c +++ b/src/regexp.c @@ -51,17 +51,32 @@ toggle_Magic(int x) } #ifdef FEAT_RELTIME +static int timeout_nesting = 0; + +/* + * Start a timer that will cause the regexp to abort after "msec". + * This doesn't work well recursively. In case it happens anyway, the first + * set timeout will prevail, nested ones are ignored. + * The caller must make sure there is a matching disable_regexp_timeout() call! + */ void init_regexp_timeout(long msec) { - timeout_flag = start_timeout(msec); + if (timeout_nesting == 0) + timeout_flag = start_timeout(msec); + ++timeout_nesting; } void disable_regexp_timeout(void) { - stop_timeout(); - timeout_flag = &dummy_timeout_flag; + if (timeout_nesting == 0) + iemsg("disable_regexp_timeout() called without active timer"); + else if (--timeout_nesting == 0) + { + stop_timeout(); + timeout_flag = &dummy_timeout_flag; + } } #endif |