3ef2ca
To: vim_dev@googlegroups.com
3ef2ca
Subject: Patch 7.4.497
3ef2ca
Fcc: outbox
3ef2ca
From: Bram Moolenaar <Bram@moolenaar.net>
3ef2ca
Mime-Version: 1.0
3ef2ca
Content-Type: text/plain; charset=UTF-8
3ef2ca
Content-Transfer-Encoding: 8bit
3ef2ca
------------
3ef2ca
3ef2ca
Patch 7.4.497
3ef2ca
Problem:    With some regexp patterns the NFA engine uses many states and
3ef2ca
	    becomes very slow.  To the user it looks like Vim freezes.
3ef2ca
Solution:   When the number of states reaches a limit fall back to the old
3ef2ca
	    engine. (Christian Brabandt)
3ef2ca
Files:	    runtime/doc/options.txt, src/Makefile, src/regexp.c, src/regexp.h,
3ef2ca
	    src/regexp_nfa.c, src/testdir/Make_dos.mak,
3ef2ca
	    src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
3ef2ca
	    src/testdir/Makefile, src/testdir/samples/re.freeze.txt,
3ef2ca
	    src/testdir/bench_re_freeze.in, src/testdir/bench_re_freeze.vim,
3ef2ca
	    Filelist
3ef2ca
3ef2ca
3ef2ca
*** ../vim-7.4.496/runtime/doc/options.txt	2014-09-23 15:45:04.866801055 +0200
3ef2ca
--- runtime/doc/options.txt	2014-11-05 12:06:16.664961112 +0100
3ef2ca
***************
3ef2ca
*** 5622,5627 ****
3ef2ca
--- 5626,5635 ----
3ef2ca
  	Note that when using the NFA engine and the pattern contains something
3ef2ca
  	that is not supported the pattern will not match.  This is only useful
3ef2ca
  	for debugging the regexp engine.
3ef2ca
+ 	Using automatic selection enables Vim to switch the engine, if the
3ef2ca
+ 	default engine becomes too costly.  E.g., when the NFA engine uses too
3ef2ca
+ 	many states.  This should prevent Vim from hanging on a combination of
3ef2ca
+ 	a complex pattern with long text.
3ef2ca
  
3ef2ca
  		*'relativenumber'* *'rnu'* *'norelativenumber'* *'nornu'*
3ef2ca
  'relativenumber' 'rnu'	boolean	(default off)
3ef2ca
*** ../vim-7.4.496/src/Makefile	2014-08-17 17:05:39.155057796 +0200
3ef2ca
--- src/Makefile	2014-11-05 12:01:58.704967328 +0100
3ef2ca
***************
3ef2ca
*** 1879,1884 ****
3ef2ca
--- 1879,1887 ----
3ef2ca
  	cd testdir; $(MAKE) -f Makefile $(GUI_TESTTARGET) VIMPROG=../$(VIMTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE)
3ef2ca
  	$(MAKE) -f Makefile unittest
3ef2ca
  
3ef2ca
+ benchmark:
3ef2ca
+ 	cd testdir; $(MAKE) -f Makefile benchmark VIMPROG=../$(VIMTARGET) SCRIPTSOURCE=../$(SCRIPTSOURCE)
3ef2ca
+ 
3ef2ca
  unittesttargets:
3ef2ca
  	$(MAKE) -f Makefile $(UNITTEST_TARGETS)
3ef2ca
  
3ef2ca
*** ../vim-7.4.496/src/regexp.c	2014-09-09 17:18:44.008540299 +0200
3ef2ca
--- src/regexp.c	2014-11-05 14:05:40.544788489 +0100
3ef2ca
***************
3ef2ca
*** 8011,8023 ****
3ef2ca
      bt_regcomp,
3ef2ca
      bt_regfree,
3ef2ca
      bt_regexec_nl,
3ef2ca
!     bt_regexec_multi
3ef2ca
! #ifdef DEBUG
3ef2ca
!     ,(char_u *)""
3ef2ca
! #endif
3ef2ca
  };
3ef2ca
  
3ef2ca
- 
3ef2ca
  #include "regexp_nfa.c"
3ef2ca
  
3ef2ca
  static regengine_T nfa_regengine =
3ef2ca
--- 8011,8020 ----
3ef2ca
      bt_regcomp,
3ef2ca
      bt_regfree,
3ef2ca
      bt_regexec_nl,
3ef2ca
!     bt_regexec_multi,
3ef2ca
!     (char_u *)""
3ef2ca
  };
3ef2ca
  
3ef2ca
  #include "regexp_nfa.c"
3ef2ca
  
3ef2ca
  static regengine_T nfa_regengine =
3ef2ca
***************
3ef2ca
*** 8025,8042 ****
3ef2ca
      nfa_regcomp,
3ef2ca
      nfa_regfree,
3ef2ca
      nfa_regexec_nl,
3ef2ca
!     nfa_regexec_multi
3ef2ca
! #ifdef DEBUG
3ef2ca
!     ,(char_u *)""
3ef2ca
! #endif
3ef2ca
  };
3ef2ca
  
3ef2ca
  /* Which regexp engine to use? Needed for vim_regcomp().
3ef2ca
   * Must match with 'regexpengine'. */
3ef2ca
  static int regexp_engine = 0;
3ef2ca
! #define	    AUTOMATIC_ENGINE	0
3ef2ca
! #define	    BACKTRACKING_ENGINE	1
3ef2ca
! #define	    NFA_ENGINE		2
3ef2ca
  #ifdef DEBUG
3ef2ca
  static char_u regname[][30] = {
3ef2ca
  		    "AUTOMATIC Regexp Engine",
3ef2ca
--- 8022,8035 ----
3ef2ca
      nfa_regcomp,
3ef2ca
      nfa_regfree,
3ef2ca
      nfa_regexec_nl,
3ef2ca
!     nfa_regexec_multi,
3ef2ca
!     (char_u *)""
3ef2ca
  };
3ef2ca
  
3ef2ca
  /* Which regexp engine to use? Needed for vim_regcomp().
3ef2ca
   * Must match with 'regexpengine'. */
3ef2ca
  static int regexp_engine = 0;
3ef2ca
! 
3ef2ca
  #ifdef DEBUG
3ef2ca
  static char_u regname[][30] = {
3ef2ca
  		    "AUTOMATIC Regexp Engine",
3ef2ca
***************
3ef2ca
*** 8083,8092 ****
3ef2ca
  	    regexp_engine = AUTOMATIC_ENGINE;
3ef2ca
  	}
3ef2ca
      }
3ef2ca
- #ifdef DEBUG
3ef2ca
      bt_regengine.expr = expr;
3ef2ca
      nfa_regengine.expr = expr;
3ef2ca
- #endif
3ef2ca
  
3ef2ca
      /*
3ef2ca
       * First try the NFA engine, unless backtracking was requested.
3ef2ca
--- 8076,8083 ----
3ef2ca
***************
3ef2ca
*** 8096,8102 ****
3ef2ca
      else
3ef2ca
  	prog = bt_regengine.regcomp(expr, re_flags);
3ef2ca
  
3ef2ca
!     if (prog == NULL)	    /* error compiling regexp with initial engine */
3ef2ca
      {
3ef2ca
  #ifdef BT_REGEXP_DEBUG_LOG
3ef2ca
  	if (regexp_engine != BACKTRACKING_ENGINE)   /* debugging log for NFA */
3ef2ca
--- 8087,8094 ----
3ef2ca
      else
3ef2ca
  	prog = bt_regengine.regcomp(expr, re_flags);
3ef2ca
  
3ef2ca
!     /* Check for error compiling regexp with initial engine. */
3ef2ca
!     if (prog == NULL)
3ef2ca
      {
3ef2ca
  #ifdef BT_REGEXP_DEBUG_LOG
3ef2ca
  	if (regexp_engine != BACKTRACKING_ENGINE)   /* debugging log for NFA */
3ef2ca
***************
3ef2ca
*** 8114,8126 ****
3ef2ca
  	}
3ef2ca
  #endif
3ef2ca
  	/*
3ef2ca
! 	 * If the NFA engine failed, the backtracking engine won't work either.
3ef2ca
  	 *
3ef2ca
  	if (regexp_engine == AUTOMATIC_ENGINE)
3ef2ca
  	    prog = bt_regengine.regcomp(expr, re_flags);
3ef2ca
  	 */
3ef2ca
      }
3ef2ca
  
3ef2ca
      return prog;
3ef2ca
  }
3ef2ca
  
3ef2ca
--- 8106,8132 ----
3ef2ca
  	}
3ef2ca
  #endif
3ef2ca
  	/*
3ef2ca
! 	 * If the NFA engine failed, try the backtracking engine.
3ef2ca
! 	 * Disabled for now, both engines fail on the same patterns.
3ef2ca
! 	 * Re-enable when regcomp() fails when the pattern would work better
3ef2ca
! 	 * with the other engine.
3ef2ca
  	 *
3ef2ca
  	if (regexp_engine == AUTOMATIC_ENGINE)
3ef2ca
+ 	{
3ef2ca
  	    prog = bt_regengine.regcomp(expr, re_flags);
3ef2ca
+ 	    regexp_engine == BACKTRACKING_ENGINE;
3ef2ca
+ 	}
3ef2ca
  	 */
3ef2ca
      }
3ef2ca
  
3ef2ca
+     if (prog != NULL)
3ef2ca
+     {
3ef2ca
+ 	/* Store the info needed to call regcomp() again when the engine turns
3ef2ca
+ 	 * out to be very slow when executing it. */
3ef2ca
+ 	prog->re_engine = regexp_engine;
3ef2ca
+ 	prog->re_flags  = re_flags;
3ef2ca
+     }
3ef2ca
+ 
3ef2ca
      return prog;
3ef2ca
  }
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 8135,8154 ****
3ef2ca
  	prog->engine->regfree(prog);
3ef2ca
  }
3ef2ca
  
3ef2ca
  /*
3ef2ca
   * Match a regexp against a string.
3ef2ca
   * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
3ef2ca
   * Uses curbuf for line count and 'iskeyword'.
3ef2ca
   *
3ef2ca
   * Return TRUE if there is a match, FALSE if not.
3ef2ca
   */
3ef2ca
      int
3ef2ca
  vim_regexec(rmp, line, col)
3ef2ca
!     regmatch_T *rmp;
3ef2ca
!     char_u      *line;  /* string to match against */
3ef2ca
!     colnr_T     col;    /* column to start looking for match */
3ef2ca
  {
3ef2ca
!     return rmp->regprog->engine->regexec_nl(rmp, line, col, FALSE);
3ef2ca
  }
3ef2ca
  
3ef2ca
  #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
3ef2ca
--- 8141,8215 ----
3ef2ca
  	prog->engine->regfree(prog);
3ef2ca
  }
3ef2ca
  
3ef2ca
+ #ifdef FEAT_EVAL
3ef2ca
+ static void report_re_switch __ARGS((char_u *pat));
3ef2ca
+ 
3ef2ca
+     static void
3ef2ca
+ report_re_switch(pat)
3ef2ca
+     char_u *pat;
3ef2ca
+ {
3ef2ca
+     if (p_verbose > 0)
3ef2ca
+     {
3ef2ca
+ 	verbose_enter();
3ef2ca
+ 	MSG_PUTS(_("Switching to backtracking RE engine for pattern: "));
3ef2ca
+ 	MSG_PUTS(pat);
3ef2ca
+ 	verbose_leave();
3ef2ca
+     }
3ef2ca
+ }
3ef2ca
+ #endif
3ef2ca
+ 
3ef2ca
+ static int vim_regexec_both __ARGS((regmatch_T *rmp, char_u *line, colnr_T col, int nl));
3ef2ca
+ 
3ef2ca
  /*
3ef2ca
   * Match a regexp against a string.
3ef2ca
   * "rmp->regprog" is a compiled regexp as returned by vim_regcomp().
3ef2ca
   * Uses curbuf for line count and 'iskeyword'.
3ef2ca
+  * When "nl" is TRUE consider a "\n" in "line" to be a line break.
3ef2ca
   *
3ef2ca
   * Return TRUE if there is a match, FALSE if not.
3ef2ca
   */
3ef2ca
+     static int
3ef2ca
+ vim_regexec_both(rmp, line, col, nl)
3ef2ca
+     regmatch_T	*rmp;
3ef2ca
+     char_u	*line;  /* string to match against */
3ef2ca
+     colnr_T	col;    /* column to start looking for match */
3ef2ca
+     int		nl;
3ef2ca
+ {
3ef2ca
+     int result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl);
3ef2ca
+ 
3ef2ca
+     /* NFA engine aborted because it's very slow. */
3ef2ca
+     if (rmp->regprog->re_engine == AUTOMATIC_ENGINE
3ef2ca
+ 					       && result == NFA_TOO_EXPENSIVE)
3ef2ca
+     {
3ef2ca
+ 	int    save_p_re = p_re;
3ef2ca
+ 	int    re_flags = rmp->regprog->re_flags;
3ef2ca
+ 	char_u *pat = vim_strsave(((nfa_regprog_T *)rmp->regprog)->pattern);
3ef2ca
+ 
3ef2ca
+ 	p_re = BACKTRACKING_ENGINE;
3ef2ca
+ 	vim_regfree(rmp->regprog);
3ef2ca
+ 	if (pat != NULL)
3ef2ca
+ 	{
3ef2ca
+ #ifdef FEAT_EVAL
3ef2ca
+ 	    report_re_switch(pat);
3ef2ca
+ #endif
3ef2ca
+ 	    rmp->regprog = vim_regcomp(pat, re_flags);
3ef2ca
+ 	    if (rmp->regprog != NULL)
3ef2ca
+ 		result = rmp->regprog->engine->regexec_nl(rmp, line, col, nl);
3ef2ca
+ 	    vim_free(pat);
3ef2ca
+ 	}
3ef2ca
+ 
3ef2ca
+ 	p_re = save_p_re;
3ef2ca
+     }
3ef2ca
+     return result;
3ef2ca
+ }
3ef2ca
+ 
3ef2ca
      int
3ef2ca
  vim_regexec(rmp, line, col)
3ef2ca
!     regmatch_T	*rmp;
3ef2ca
!     char_u	*line;
3ef2ca
!     colnr_T	col;
3ef2ca
  {
3ef2ca
!     return vim_regexec_both(rmp, line, col, FALSE);
3ef2ca
  }
3ef2ca
  
3ef2ca
  #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) \
3ef2ca
***************
3ef2ca
*** 8158,8168 ****
3ef2ca
   */
3ef2ca
      int
3ef2ca
  vim_regexec_nl(rmp, line, col)
3ef2ca
!     regmatch_T *rmp;
3ef2ca
!     char_u *line;
3ef2ca
!     colnr_T col;
3ef2ca
  {
3ef2ca
!     return rmp->regprog->engine->regexec_nl(rmp, line, col, TRUE);
3ef2ca
  }
3ef2ca
  #endif
3ef2ca
  
3ef2ca
--- 8219,8229 ----
3ef2ca
   */
3ef2ca
      int
3ef2ca
  vim_regexec_nl(rmp, line, col)
3ef2ca
!     regmatch_T	*rmp;
3ef2ca
!     char_u	*line;
3ef2ca
!     colnr_T	col;
3ef2ca
  {
3ef2ca
!     return vim_regexec_both(rmp, line, col, TRUE);
3ef2ca
  }
3ef2ca
  #endif
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 8183,8187 ****
3ef2ca
      colnr_T     col;            /* column to start looking for match */
3ef2ca
      proftime_T	*tm;		/* timeout limit or NULL */
3ef2ca
  {
3ef2ca
!     return rmp->regprog->engine->regexec_multi(rmp, win, buf, lnum, col, tm);
3ef2ca
  }
3ef2ca
--- 8244,8275 ----
3ef2ca
      colnr_T     col;            /* column to start looking for match */
3ef2ca
      proftime_T	*tm;		/* timeout limit or NULL */
3ef2ca
  {
3ef2ca
!     int result = rmp->regprog->engine->regexec_multi(
3ef2ca
! 						rmp, win, buf, lnum, col, tm);
3ef2ca
! 
3ef2ca
!     /* NFA engine aborted because it's very slow. */
3ef2ca
!     if (rmp->regprog->re_engine == AUTOMATIC_ENGINE
3ef2ca
! 					       && result == NFA_TOO_EXPENSIVE)
3ef2ca
!     {
3ef2ca
! 	int    save_p_re = p_re;
3ef2ca
! 	int    re_flags = rmp->regprog->re_flags;
3ef2ca
! 	char_u *pat = vim_strsave(((nfa_regprog_T *)rmp->regprog)->pattern);
3ef2ca
! 
3ef2ca
! 	p_re = BACKTRACKING_ENGINE;
3ef2ca
! 	vim_regfree(rmp->regprog);
3ef2ca
! 	if (pat != NULL)
3ef2ca
! 	{
3ef2ca
! #ifdef FEAT_EVAL
3ef2ca
! 	    report_re_switch(pat);
3ef2ca
! #endif
3ef2ca
! 	    rmp->regprog = vim_regcomp(pat, re_flags);
3ef2ca
! 	    if (rmp->regprog != NULL)
3ef2ca
! 		result = rmp->regprog->engine->regexec_multi(
3ef2ca
! 						rmp, win, buf, lnum, col, tm);
3ef2ca
! 	    vim_free(pat);
3ef2ca
! 	}
3ef2ca
! 	p_re = save_p_re;
3ef2ca
!     }
3ef2ca
! 
3ef2ca
!     return result;
3ef2ca
  }
3ef2ca
*** ../vim-7.4.496/src/regexp.h	2014-04-23 19:06:33.702828771 +0200
3ef2ca
--- src/regexp.h	2014-11-05 13:09:14.136870089 +0100
3ef2ca
***************
3ef2ca
*** 27,32 ****
3ef2ca
--- 27,44 ----
3ef2ca
   */
3ef2ca
  #define NFA_MAX_BRACES 20
3ef2ca
  
3ef2ca
+ /*
3ef2ca
+  * In the NFA engine: how many states are allowed
3ef2ca
+  */
3ef2ca
+ #define NFA_MAX_STATES 100000
3ef2ca
+ #define NFA_TOO_EXPENSIVE -1
3ef2ca
+ 
3ef2ca
+ /* Which regexp engine to use? Needed for vim_regcomp().
3ef2ca
+  * Must match with 'regexpengine'. */
3ef2ca
+ #define	    AUTOMATIC_ENGINE	0
3ef2ca
+ #define	    BACKTRACKING_ENGINE	1
3ef2ca
+ #define	    NFA_ENGINE		2
3ef2ca
+ 
3ef2ca
  typedef struct regengine regengine_T;
3ef2ca
  
3ef2ca
  /*
3ef2ca
***************
3ef2ca
*** 38,43 ****
3ef2ca
--- 50,57 ----
3ef2ca
  {
3ef2ca
      regengine_T		*engine;
3ef2ca
      unsigned		regflags;
3ef2ca
+     unsigned		re_engine;   /* automatic, backtracking or nfa engine */
3ef2ca
+     unsigned		re_flags;    /* second argument for vim_regcomp() */
3ef2ca
  } regprog_T;
3ef2ca
  
3ef2ca
  /*
3ef2ca
***************
3ef2ca
*** 47,55 ****
3ef2ca
   */
3ef2ca
  typedef struct
3ef2ca
  {
3ef2ca
!     /* These two members implement regprog_T */
3ef2ca
      regengine_T		*engine;
3ef2ca
      unsigned		regflags;
3ef2ca
  
3ef2ca
      int			regstart;
3ef2ca
      char_u		reganch;
3ef2ca
--- 61,71 ----
3ef2ca
   */
3ef2ca
  typedef struct
3ef2ca
  {
3ef2ca
!     /* These four members implement regprog_T */
3ef2ca
      regengine_T		*engine;
3ef2ca
      unsigned		regflags;
3ef2ca
+     unsigned		re_engine;
3ef2ca
+     unsigned		re_flags;    /* second argument for vim_regcomp() */
3ef2ca
  
3ef2ca
      int			regstart;
3ef2ca
      char_u		reganch;
3ef2ca
***************
3ef2ca
*** 81,89 ****
3ef2ca
   */
3ef2ca
  typedef struct
3ef2ca
  {
3ef2ca
!     /* These two members implement regprog_T */
3ef2ca
      regengine_T		*engine;
3ef2ca
      unsigned		regflags;
3ef2ca
  
3ef2ca
      nfa_state_T		*start;		/* points into state[] */
3ef2ca
  
3ef2ca
--- 97,107 ----
3ef2ca
   */
3ef2ca
  typedef struct
3ef2ca
  {
3ef2ca
!     /* These three members implement regprog_T */
3ef2ca
      regengine_T		*engine;
3ef2ca
      unsigned		regflags;
3ef2ca
+     unsigned		re_engine;
3ef2ca
+     unsigned		re_flags;    /* second argument for vim_regcomp() */
3ef2ca
  
3ef2ca
      nfa_state_T		*start;		/* points into state[] */
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 96,104 ****
3ef2ca
  #ifdef FEAT_SYN_HL
3ef2ca
      int			reghasz;
3ef2ca
  #endif
3ef2ca
- #ifdef DEBUG
3ef2ca
      char_u		*pattern;
3ef2ca
- #endif
3ef2ca
      int			nsubexp;	/* number of () */
3ef2ca
      int			nstate;
3ef2ca
      nfa_state_T		state[1];	/* actually longer.. */
3ef2ca
--- 114,120 ----
3ef2ca
***************
3ef2ca
*** 151,159 ****
3ef2ca
      void	(*regfree)(regprog_T *);
3ef2ca
      int		(*regexec_nl)(regmatch_T*, char_u*, colnr_T, int);
3ef2ca
      long	(*regexec_multi)(regmmatch_T*, win_T*, buf_T*, linenr_T, colnr_T, proftime_T*);
3ef2ca
- #ifdef DEBUG
3ef2ca
      char_u	*expr;
3ef2ca
- #endif
3ef2ca
  };
3ef2ca
  
3ef2ca
  #endif	/* _REGEXP_H */
3ef2ca
--- 167,173 ----
3ef2ca
*** ../vim-7.4.496/src/regexp_nfa.c	2014-10-11 12:48:22.541259950 +0200
3ef2ca
--- src/regexp_nfa.c	2014-11-05 13:08:43.876870818 +0100
3ef2ca
***************
3ef2ca
*** 5522,5527 ****
3ef2ca
--- 5522,5534 ----
3ef2ca
  	nextlist->n = 0;	    /* clear nextlist */
3ef2ca
  	nextlist->has_pim = FALSE;
3ef2ca
  	++nfa_listid;
3ef2ca
+ 	if (prog->re_engine == AUTOMATIC_ENGINE && nfa_listid >= NFA_MAX_STATES)
3ef2ca
+ 	{
3ef2ca
+ 	    /* too many states, retry with old engine */
3ef2ca
+ 	    nfa_match = NFA_TOO_EXPENSIVE;
3ef2ca
+ 	    goto theend;
3ef2ca
+ 	}
3ef2ca
+ 
3ef2ca
  	thislist->id = nfa_listid;
3ef2ca
  	nextlist->id = nfa_listid + 1;
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 5704,5709 ****
3ef2ca
--- 5711,5721 ----
3ef2ca
  			 */
3ef2ca
  			result = recursive_regmatch(t->state, NULL, prog,
3ef2ca
  						       submatch, m, &listids);
3ef2ca
+ 			if (result == NFA_TOO_EXPENSIVE)
3ef2ca
+ 			{
3ef2ca
+ 			    nfa_match = result;
3ef2ca
+ 			    goto theend;
3ef2ca
+ 			}
3ef2ca
  
3ef2ca
  			/* for \@! and \@
3ef2ca
  			 * FALSE */
3ef2ca
***************
3ef2ca
*** 5817,5822 ****
3ef2ca
--- 5829,5839 ----
3ef2ca
  		/* First try matching the pattern. */
3ef2ca
  		result = recursive_regmatch(t->state, NULL, prog,
3ef2ca
  						       submatch, m, &listids);
3ef2ca
+ 		if (result == NFA_TOO_EXPENSIVE)
3ef2ca
+ 		{
3ef2ca
+ 		    nfa_match = result;
3ef2ca
+ 		    goto theend;
3ef2ca
+ 		}
3ef2ca
  		if (result)
3ef2ca
  		{
3ef2ca
  		    int bytelen;
3ef2ca
***************
3ef2ca
*** 6760,6765 ****
3ef2ca
--- 6777,6783 ----
3ef2ca
      int		i;
3ef2ca
      regsubs_T	subs, m;
3ef2ca
      nfa_state_T	*start = prog->start;
3ef2ca
+     int		result;
3ef2ca
  #ifdef ENABLE_LOG
3ef2ca
      FILE	*f;
3ef2ca
  #endif
3ef2ca
***************
3ef2ca
*** 6791,6798 ****
3ef2ca
      clear_sub(&m.synt);
3ef2ca
  #endif
3ef2ca
  
3ef2ca
!     if (nfa_regmatch(prog, start, &subs, &m) == FALSE)
3ef2ca
  	return 0;
3ef2ca
  
3ef2ca
      cleanup_subexpr();
3ef2ca
      if (REG_MULTI)
3ef2ca
--- 6809,6819 ----
3ef2ca
      clear_sub(&m.synt);
3ef2ca
  #endif
3ef2ca
  
3ef2ca
!     result = nfa_regmatch(prog, start, &subs, &m);
3ef2ca
!     if (result == FALSE)
3ef2ca
  	return 0;
3ef2ca
+     else if (result == NFA_TOO_EXPENSIVE)
3ef2ca
+ 	return result;
3ef2ca
  
3ef2ca
      cleanup_subexpr();
3ef2ca
      if (REG_MULTI)
3ef2ca
***************
3ef2ca
*** 6929,6937 ****
3ef2ca
      nfa_nsubexpr = prog->nsubexp;
3ef2ca
      nfa_listid = 1;
3ef2ca
      nfa_alt_listid = 2;
3ef2ca
- #ifdef DEBUG
3ef2ca
      nfa_regengine.expr = prog->pattern;
3ef2ca
- #endif
3ef2ca
  
3ef2ca
      if (prog->reganch && col > 0)
3ef2ca
  	return 0L;
3ef2ca
--- 6950,6956 ----
3ef2ca
***************
3ef2ca
*** 6979,6987 ****
3ef2ca
  
3ef2ca
      retval = nfa_regtry(prog, col);
3ef2ca
  
3ef2ca
- #ifdef DEBUG
3ef2ca
      nfa_regengine.expr = NULL;
3ef2ca
- #endif
3ef2ca
  
3ef2ca
  theend:
3ef2ca
      return retval;
3ef2ca
--- 6998,7004 ----
3ef2ca
***************
3ef2ca
*** 7003,7011 ****
3ef2ca
      if (expr == NULL)
3ef2ca
  	return NULL;
3ef2ca
  
3ef2ca
- #ifdef DEBUG
3ef2ca
      nfa_regengine.expr = expr;
3ef2ca
- #endif
3ef2ca
  
3ef2ca
      init_class_tab();
3ef2ca
  
3ef2ca
--- 7020,7026 ----
3ef2ca
***************
3ef2ca
*** 7082,7091 ****
3ef2ca
      /* Remember whether this pattern has any \z specials in it. */
3ef2ca
      prog->reghasz = re_has_z;
3ef2ca
  #endif
3ef2ca
- #ifdef DEBUG
3ef2ca
      prog->pattern = vim_strsave(expr);
3ef2ca
      nfa_regengine.expr = NULL;
3ef2ca
- #endif
3ef2ca
  
3ef2ca
  out:
3ef2ca
      vim_free(post_start);
3ef2ca
--- 7097,7104 ----
3ef2ca
***************
3ef2ca
*** 7099,7107 ****
3ef2ca
  #ifdef ENABLE_LOG
3ef2ca
      nfa_postfix_dump(expr, FAIL);
3ef2ca
  #endif
3ef2ca
- #ifdef DEBUG
3ef2ca
      nfa_regengine.expr = NULL;
3ef2ca
- #endif
3ef2ca
      goto out;
3ef2ca
  }
3ef2ca
  
3ef2ca
--- 7112,7118 ----
3ef2ca
***************
3ef2ca
*** 7115,7123 ****
3ef2ca
      if (prog != NULL)
3ef2ca
      {
3ef2ca
  	vim_free(((nfa_regprog_T *)prog)->match_text);
3ef2ca
- #ifdef DEBUG
3ef2ca
  	vim_free(((nfa_regprog_T *)prog)->pattern);
3ef2ca
- #endif
3ef2ca
  	vim_free(prog);
3ef2ca
      }
3ef2ca
  }
3ef2ca
--- 7126,7132 ----
3ef2ca
*** ../vim-7.4.496/src/testdir/Make_dos.mak	2014-10-21 20:57:11.534295006 +0200
3ef2ca
--- src/testdir/Make_dos.mak	2014-11-05 14:14:56.536775091 +0100
3ef2ca
***************
3ef2ca
*** 87,92 ****
3ef2ca
--- 87,93 ----
3ef2ca
  	-if exist Xfind rd /s /q Xfind
3ef2ca
  	-if exist viminfo del viminfo
3ef2ca
  	-del test.log
3ef2ca
+ 	-if exists benchmark.out del benchmark.out
3ef2ca
  
3ef2ca
  .in.out:
3ef2ca
  	-if exist $*.failed del $*.failed
3ef2ca
***************
3ef2ca
*** 103,105 ****
3ef2ca
--- 104,114 ----
3ef2ca
  
3ef2ca
  nolog:
3ef2ca
  	-del test.log
3ef2ca
+ 
3ef2ca
+ benchmark:
3ef2ca
+ 	bench_re_freeze.out
3ef2ca
+ 
3ef2ca
+ bench_re_freeze.out: bench_re_freeze.vim
3ef2ca
+ 	-if exist benchmark.out del benchmark.out
3ef2ca
+ 	$(VIMPROG) -u dos.vim -U NONE --noplugin $*.in
3ef2ca
+ 	@IF EXIST benchmark.out ( type benchmark.out )
3ef2ca
*** ../vim-7.4.496/src/testdir/Make_ming.mak	2014-10-21 20:57:11.534295006 +0200
3ef2ca
--- src/testdir/Make_ming.mak	2014-11-05 14:15:09.608774776 +0100
3ef2ca
***************
3ef2ca
*** 12,22 ****
3ef2ca
--- 12,24 ----
3ef2ca
  DEL = rm -f
3ef2ca
  MV = mv
3ef2ca
  CP = cp
3ef2ca
+ CAT = cat
3ef2ca
  DIRSLASH = /
3ef2ca
  else
3ef2ca
  DEL = del
3ef2ca
  MV = rename
3ef2ca
  CP = copy
3ef2ca
+ CAT = type
3ef2ca
  DIRSLASH = \\
3ef2ca
  endif
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 72,77 ****
3ef2ca
--- 74,81 ----
3ef2ca
  
3ef2ca
  SCRIPTS_GUI = test16.out
3ef2ca
  
3ef2ca
+ SCRIPTS_BENCH = bench_re_freeze.out
3ef2ca
+ 
3ef2ca
  .SUFFIXES: .in .out
3ef2ca
  
3ef2ca
  vimall:	fixff $(SCRIPTS16) $(SCRIPTS) $(SCRIPTS_GUI) $(SCRIPTS32)
3ef2ca
***************
3ef2ca
*** 80,85 ****
3ef2ca
--- 84,91 ----
3ef2ca
  nongui:	fixff $(SCRIPTS16) $(SCRIPTS)
3ef2ca
  	echo ALL DONE
3ef2ca
  
3ef2ca
+ benchmark: $(SCRIPTS_BENCH)
3ef2ca
+ 
3ef2ca
  small:
3ef2ca
  	echo ALL DONE
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 114,116 ****
3ef2ca
--- 120,127 ----
3ef2ca
  	-$(DEL) X*
3ef2ca
  	-$(DEL) test.ok
3ef2ca
  	-$(DEL) viminfo
3ef2ca
+ 
3ef2ca
+ bench_re_freeze.out: bench_re_freeze.vim
3ef2ca
+ 	-$(DEL) benchmark.out
3ef2ca
+ 	$(VIMPROG) -u dos.vim -U NONE --noplugin $*.in
3ef2ca
+ 	$(CAT) benchmark.out
3ef2ca
*** ../vim-7.4.496/src/testdir/Make_os2.mak	2014-10-21 20:57:11.538295006 +0200
3ef2ca
--- src/testdir/Make_os2.mak	2014-11-05 12:57:59.616886342 +0100
3ef2ca
***************
3ef2ca
*** 50,55 ****
3ef2ca
--- 50,57 ----
3ef2ca
  		test_signs.out \
3ef2ca
  		test_utf8.out
3ef2ca
  
3ef2ca
+ SCRIPTS_BENCH = bench_re_freeze.out
3ef2ca
+ 
3ef2ca
  .SUFFIXES: .in .out
3ef2ca
  
3ef2ca
  all:	/tmp $(SCRIPTS)
3ef2ca
***************
3ef2ca
*** 57,62 ****
3ef2ca
--- 59,66 ----
3ef2ca
  
3ef2ca
  $(SCRIPTS): $(VIMPROG)
3ef2ca
  
3ef2ca
+ benchmark: $(SCRIPTS_BENCH)
3ef2ca
+ 
3ef2ca
  clean:
3ef2ca
  	-rm -rf *.out Xdotest test.ok tiny.vim small.vim mbyte.vim viminfo
3ef2ca
  
3ef2ca
***************
3ef2ca
*** 75,77 ****
3ef2ca
--- 79,88 ----
3ef2ca
  # Create a directory for temp files
3ef2ca
  /tmp:
3ef2ca
  	-mkdir /tmp
3ef2ca
+ 
3ef2ca
+ bench_re_freeze.out: bench_re_freeze.vim
3ef2ca
+ 	-del $*.failed test.ok benchmark.out
3ef2ca
+ 	copy $*.ok test.ok
3ef2ca
+ 	$(VIMPROG) -u os2.vim --noplugin -s dotest.in $*.in
3ef2ca
+ 	type benchmark.out
3ef2ca
+ 
3ef2ca
*** ../vim-7.4.496/src/testdir/Makefile	2014-10-21 20:57:11.538295006 +0200
3ef2ca
--- src/testdir/Makefile	2014-11-05 14:15:13.320774687 +0100
3ef2ca
***************
3ef2ca
*** 48,59 ****
3ef2ca
--- 48,63 ----
3ef2ca
  
3ef2ca
  SCRIPTS_GUI = test16.out
3ef2ca
  
3ef2ca
+ SCRIPTS_BENCH = bench_re_freeze.out
3ef2ca
+ 
3ef2ca
  .SUFFIXES: .in .out
3ef2ca
  
3ef2ca
  nongui:	nolog $(SCRIPTS) report
3ef2ca
  
3ef2ca
  gui:	nolog $(SCRIPTS) $(SCRIPTS_GUI) report
3ef2ca
  
3ef2ca
+ benchmark: $(SCRIPTS_BENCH)
3ef2ca
+ 
3ef2ca
  report:
3ef2ca
  	@echo
3ef2ca
  	@echo 'Test results:'
3ef2ca
***************
3ef2ca
*** 65,71 ****
3ef2ca
  $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
3ef2ca
  
3ef2ca
  RM_ON_RUN = test.out X* viminfo
3ef2ca
! RM_ON_START = tiny.vim small.vim mbyte.vim mzscheme.vim lua.vim test.ok
3ef2ca
  RUN_VIM = VIMRUNTIME=$(SCRIPTSOURCE); export VIMRUNTIME; $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in
3ef2ca
  
3ef2ca
  clean:
3ef2ca
--- 69,75 ----
3ef2ca
  $(SCRIPTS) $(SCRIPTS_GUI): $(VIMPROG)
3ef2ca
  
3ef2ca
  RM_ON_RUN = test.out X* viminfo
3ef2ca
! RM_ON_START = tiny.vim small.vim mbyte.vim mzscheme.vim lua.vim test.ok benchmark.out
3ef2ca
  RUN_VIM = VIMRUNTIME=$(SCRIPTSOURCE); export VIMRUNTIME; $(VALGRIND) $(VIMPROG) -u unix.vim -U NONE --noplugin -s dotest.in
3ef2ca
  
3ef2ca
  clean:
3ef2ca
***************
3ef2ca
*** 120,124 ****
3ef2ca
--- 124,137 ----
3ef2ca
  
3ef2ca
  test60.out: test60.vim
3ef2ca
  
3ef2ca
+ bench_re_freeze.out: bench_re_freeze.vim
3ef2ca
+ 	-rm -rf benchmark.out $(RM_ON_RUN)
3ef2ca
+ 	# Sleep a moment to avoid that the xterm title is messed up.
3ef2ca
+ 	# 200 msec is sufficient, but only modern sleep supports a fraction of
3ef2ca
+ 	# a second, fall back to a second if it fails.
3ef2ca
+ 	@-/bin/sh -c "sleep .2 > /dev/null 2>&1 || sleep 1"
3ef2ca
+ 	-$(RUN_VIM) $*.in
3ef2ca
+ 	@/bin/sh -c "if test -f benchmark.out; then cat benchmark.out; fi"
3ef2ca
+ 
3ef2ca
  nolog:
3ef2ca
  	-rm -f test.log
3ef2ca
*** ../vim-7.4.496/src/testdir/samples/re.freeze.txt	1970-01-01 01:00:00.000000000 +0100
3ef2ca
--- src/testdir/samples/re.freeze.txt	2014-11-05 11:50:44.176983582 +0100
3ef2ca
***************
3ef2ca
*** 0 ****
3ef2ca
--- 1,6 ----
3ef2ca
+ :set re=0 or 2
3ef2ca
+ Search for the pattern: /\s\+\%#\@
3ef2ca
+ vim should not freeze.
3ef2ca
+ 
3ef2ca
+ <font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font><font face=arial><font color=#ff0000>5</font></font> 
3ef2ca
+ 
3ef2ca
*** ../vim-7.4.496/src/testdir/bench_re_freeze.in	2014-11-05 14:02:46.420792685 +0100
3ef2ca
--- src/testdir/bench_re_freeze.in	2014-11-05 14:24:33.000761201 +0100
3ef2ca
***************
3ef2ca
*** 0 ****
3ef2ca
--- 1,13 ----
3ef2ca
+ Test for Benchmarking RE engine
3ef2ca
+ 
3ef2ca
+ STARTTEST
3ef2ca
+ :so small.vim
3ef2ca
+ :if !has("reltime") | qa! | endif
3ef2ca
+ :set nocp cpo&vim
3ef2ca
+ :so bench_re_freeze.vim
3ef2ca
+ :call Measure('samples/re.freeze.txt', '\s\+\%#\@
3ef2ca
+ :/^" Benchmark/,$w! benchmark.out
3ef2ca
+ :qa!
3ef2ca
+ ENDTEST
3ef2ca
+ 
3ef2ca
+ " Benchmark_results:
3ef2ca
*** ../vim-7.4.496/src/testdir/bench_re_freeze.vim	2014-11-05 14:02:46.432792684 +0100
3ef2ca
--- src/testdir/bench_re_freeze.vim	2014-11-05 14:09:15.668783305 +0100
3ef2ca
***************
3ef2ca
*** 0 ****
3ef2ca
--- 1,13 ----
3ef2ca
+ "Test for benchmarking the RE engine
3ef2ca
+ 
3ef2ca
+ so small.vim
3ef2ca
+ if !has("reltime") | finish | endif
3ef2ca
+ func! Measure(file, pattern, arg)
3ef2ca
+ 	for re in range(3)
3ef2ca
+ 	    let sstart=reltime()
3ef2ca
+ 	    let cmd=printf("../vim -u NONE -N --cmd ':set re=%d'".
3ef2ca
+ 		\ " -c 'call search(\"%s\", \"\", \"\", 10000)' -c ':q!' %s", re, escape(a:pattern, '\\'), empty(a:arg) ? '' : a:arg)
3ef2ca
+ 	    call system(cmd. ' '. a:file)
3ef2ca
+ 	    $put =printf('file: %s, re: %d, time: %s', a:file, re, reltimestr(reltime(sstart)))
3ef2ca
+ 	endfor
3ef2ca
+ endfunc
3ef2ca
*** ../vim-7.4.497/Filelist	2014-11-05 13:53:13.188806497 +0100
3ef2ca
--- Filelist	2014-11-05 14:11:48.208779629 +0100
3ef2ca
***************
3ef2ca
*** 102,107 ****
3ef2ca
--- 102,110 ----
3ef2ca
  		src/testdir/pythonx/topmodule/submodule/subsubmodule/subsubsubmodule.py \
3ef2ca
  		src/testdir/python_after/*.py \
3ef2ca
  		src/testdir/python_before/*.py \
3ef2ca
+ 		src/testdir/bench*.in \
3ef2ca
+ 		src/testdir/bench*.vim \
3ef2ca
+ 		src/testdir/samples.*.txt \
3ef2ca
  		src/proto.h \
3ef2ca
  		src/proto/blowfish.pro \
3ef2ca
  		src/proto/buffer.pro \
3ef2ca
*** ../vim-7.4.496/src/version.c	2014-11-05 13:53:13.188806497 +0100
3ef2ca
--- src/version.c	2014-11-05 14:02:11.728793520 +0100
3ef2ca
***************
3ef2ca
*** 743,744 ****
3ef2ca
--- 743,746 ----
3ef2ca
  {   /* Add new patch number below this line */
3ef2ca
+ /**/
3ef2ca
+     497,
3ef2ca
  /**/
3ef2ca
3ef2ca
-- 
3ef2ca
    With sufficient thrust, pigs fly just fine.
3ef2ca
                   -- RFC 1925
3ef2ca
3ef2ca
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
3ef2ca
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
3ef2ca
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
3ef2ca
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///