aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/regexp_defs.h
diff options
context:
space:
mode:
authorDavid Bürgin <676c7473@gmail.com>2015-03-28 22:28:37 +0100
committerJustin M. Keyes <justinkz@gmail.com>2015-04-05 19:24:58 -0400
commitd3bb177f1e1dcbc4104d7bba6f2ac4ebe3ffc9c9 (patch)
treef3a788c3d4f876819b13af525e43955d0952af1b /src/nvim/regexp_defs.h
parenta69e464f70f1f26c352b713f70b627ea07232e79 (diff)
downloadrneovim-d3bb177f1e1dcbc4104d7bba6f2ac4ebe3ffc9c9.tar.gz
rneovim-d3bb177f1e1dcbc4104d7bba6f2ac4ebe3ffc9c9.tar.bz2
rneovim-d3bb177f1e1dcbc4104d7bba6f2ac4ebe3ffc9c9.zip
vim-patch:7.4.497 #2295
Problem: With some regexp patterns the NFA engine uses many states and becomes very slow. To the user it looks like Vim freezes. Solution: When the number of states reaches a limit fall back to the old engine. (Christian Brabandt) https://github.com/vim/vim/releases/tag/v7-4-497 Helped-by: David Bürgin <676c7473@gmail.com> Helped-by: Justin M. Keyes <justinkz@gmail.com> Helped-by: Scott Prager <splinterofchaos@gmail.com>
Diffstat (limited to 'src/nvim/regexp_defs.h')
-rw-r--r--src/nvim/regexp_defs.h30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/nvim/regexp_defs.h b/src/nvim/regexp_defs.h
index 1e00f14ac6..6426ee441b 100644
--- a/src/nvim/regexp_defs.h
+++ b/src/nvim/regexp_defs.h
@@ -30,6 +30,16 @@
*/
#define NFA_MAX_BRACES 20
+// In the NFA engine: how many states are allowed.
+#define NFA_MAX_STATES 100000
+#define NFA_TOO_EXPENSIVE -1
+
+// Which regexp engine to use? Needed for vim_regcomp().
+// Must match with 'regexpengine'.
+#define AUTOMATIC_ENGINE 0
+#define BACKTRACKING_ENGINE 1
+#define NFA_ENGINE 2
+
typedef struct regengine regengine_T;
/*
@@ -38,8 +48,10 @@ typedef struct regengine regengine_T;
* structures are used. See code below.
*/
typedef struct regprog {
- regengine_T *engine;
+ regengine_T *engine;
unsigned regflags;
+ unsigned re_engine; ///< Automatic, backtracking or NFA engine.
+ unsigned re_flags; ///< Second argument for vim_regcomp().
} regprog_T;
/*
@@ -48,9 +60,11 @@ typedef struct regprog {
* See regexp.c for an explanation.
*/
typedef struct {
- /* These two members implement regprog_T */
- regengine_T *engine;
+ // These four members implement regprog_T.
+ regengine_T *engine;
unsigned regflags;
+ unsigned re_engine;
+ unsigned re_flags; ///< Second argument for vim_regcomp().
int regstart;
char_u reganch;
@@ -78,9 +92,11 @@ struct nfa_state {
* Structure used by the NFA matcher.
*/
typedef struct {
- /* These two members implement regprog_T */
- regengine_T *engine;
+ // These four members implement regprog_T.
+ regengine_T *engine;
unsigned regflags;
+ unsigned re_engine;
+ unsigned re_flags; ///< Second argument for vim_regcomp().
nfa_state_T *start; /* points into state[] */
@@ -91,9 +107,7 @@ typedef struct {
int has_zend; /* pattern contains \ze */
int has_backref; /* pattern contains \1 .. \9 */
int reghasz;
-#ifdef DEBUG
char_u *pattern;
-#endif
int nsubexp; /* number of () */
int nstate;
nfa_state_T state[1]; /* actually longer.. */
@@ -143,9 +157,7 @@ struct regengine {
int (*regexec_nl)(regmatch_T*, char_u*, colnr_T, bool);
long (*regexec_multi)(regmmatch_T*, win_T*, buf_T*, linenr_T, colnr_T,
proftime_T*);
-#ifdef DEBUG
char_u *expr;
-#endif
};
#endif // NVIM_REGEXP_DEFS_H