aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/regexp_nfa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/nvim/regexp_nfa.c')
-rw-r--r--src/nvim/regexp_nfa.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/nvim/regexp_nfa.c b/src/nvim/regexp_nfa.c
index 4ef91814ac..d9dc09b623 100644
--- a/src/nvim/regexp_nfa.c
+++ b/src/nvim/regexp_nfa.c
@@ -315,6 +315,9 @@ typedef struct {
int has_pim; /* TRUE when any state has a PIM */
} nfa_list_T;
+/// re_flags passed to nfa_regcomp().
+static int nfa_re_flags;
+
/* NFA regexp \ze operator encountered. */
static int nfa_has_zend;
@@ -1894,6 +1897,12 @@ static int nfa_regpiece(void)
return OK;
}
+ // The engine is very inefficient (uses too many states) when the maximum is
+ // much larger than the minimum. Bail out if we can use the other engine.
+ if ((nfa_re_flags & RE_AUTO) && maxval > minval + 200) {
+ return FAIL;
+ }
+
/* Ignore previous call to nfa_regatom() */
post_ptr = post_start + my_post_start;
/* Save parse state after the repeated atom and the \{} */
@@ -6287,6 +6296,7 @@ static regprog_T *nfa_regcomp(char_u *expr, int re_flags)
return NULL;
nfa_regengine.expr = expr;
+ nfa_re_flags = re_flags;
init_class_tab();