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