diff options
author | David Bürgin <676c7473@gmail.com> | 2015-03-28 22:28:37 +0100 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2015-04-05 19:24:58 -0400 |
commit | d3bb177f1e1dcbc4104d7bba6f2ac4ebe3ffc9c9 (patch) | |
tree | f3a788c3d4f876819b13af525e43955d0952af1b /src/nvim/regexp_defs.h | |
parent | a69e464f70f1f26c352b713f70b627ea07232e79 (diff) | |
download | rneovim-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.h | 30 |
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 |