astepano / rpms / vim

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