[vim] - patchlevel 1037

Karsten Hopp karsten at fedoraproject.org
Tue Jun 4 10:10:06 UTC 2013


commit 34ad50efef450065c89a2f2f5a08f7f72074fa6f
Author: Karsten Hopp <karsten at redhat.com>
Date:   Tue Jun 4 12:06:13 2013 +0200

    - patchlevel 1037

 7.3.1037 |  408 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 408 insertions(+), 0 deletions(-)
---
diff --git a/7.3.1037 b/7.3.1037
new file mode 100644
index 0000000..994134d
--- /dev/null
+++ b/7.3.1037
@@ -0,0 +1,408 @@
+To: vim_dev at googlegroups.com
+Subject: Patch 7.3.1037
+Fcc: outbox
+From: Bram Moolenaar <Bram at moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.3.1037
+Problem:    Look-behind matching is very slow on long lines.
+Solution:   Add a byte limit to how far back an attempt is made.
+Files:	    src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
+	    src/testdir/test64.ok
+
+
+*** ../vim-7.3.1036/src/regexp.c	2013-05-21 21:37:01.000000000 +0200
+--- src/regexp.c	2013-05-29 14:34:51.000000000 +0200
+***************
+*** 701,706 ****
+--- 701,707 ----
+  # define CASEMBC(x)
+  #endif
+  static void	reginsert __ARGS((int, char_u *));
++ static void	reginsert_nr __ARGS((int op, long val, char_u *opnd));
+  static void	reginsert_limits __ARGS((int, long, long, char_u *));
+  static char_u	*re_put_long __ARGS((char_u *pr, long_u val));
+  static int	read_limits __ARGS((long *, long *));
+***************
+*** 1781,1787 ****
+--- 1782,1790 ----
+  	case Magic('@'):
+  	    {
+  		int	lop = END;
++ 		int	nr;
+  
++ 		nr = getdecchrs();
+  		switch (no_Magic(getchr()))
+  		{
+  		    case '=': lop = MATCH; break;		  /* \@= */
+***************
+*** 1803,1809 ****
+  		    *flagp |= HASLOOKBH;
+  		}
+  		regtail(ret, regnode(END)); /* operand ends */
+! 		reginsert(lop, ret);
+  		break;
+  	    }
+  
+--- 1806,1819 ----
+  		    *flagp |= HASLOOKBH;
+  		}
+  		regtail(ret, regnode(END)); /* operand ends */
+! 		if (lop == BEHIND || lop == NOBEHIND)
+! 		{
+! 		    if (nr < 0)
+! 			nr = 0; /* no limit is same as zero limit */
+! 		    reginsert_nr(lop, nr, ret);
+! 		}
+! 		else
+! 		    reginsert(lop, ret);
+  		break;
+  	    }
+  
+***************
+*** 2780,2785 ****
+--- 2790,2827 ----
+  
+  /*
+   * Insert an operator in front of already-emitted operand.
++  * Add a number to the operator.
++  */
++     static void
++ reginsert_nr(op, val, opnd)
++     int		op;
++     long	val;
++     char_u	*opnd;
++ {
++     char_u	*src;
++     char_u	*dst;
++     char_u	*place;
++ 
++     if (regcode == JUST_CALC_SIZE)
++     {
++ 	regsize += 7;
++ 	return;
++     }
++     src = regcode;
++     regcode += 7;
++     dst = regcode;
++     while (src > opnd)
++ 	*--dst = *--src;
++ 
++     place = opnd;		/* Op node, where operand used to be. */
++     *place++ = op;
++     *place++ = NUL;
++     *place++ = NUL;
++     place = re_put_long(place, (long_u)val);
++ }
++ 
++ /*
++  * Insert an operator in front of already-emitted operand.
+   * The operator has the given limit values as operands.  Also set next pointer.
+   *
+   * Means relocating the operand.
+***************
+*** 3182,3188 ****
+  }
+  
+  /*
+!  * get and return the value of the decimal string immediately after the
+   * current position. Return -1 for invalid.  Consumes all digits.
+   */
+      static int
+--- 3224,3230 ----
+  }
+  
+  /*
+!  * Get and return the value of the decimal string immediately after the
+   * current position. Return -1 for invalid.  Consumes all digits.
+   */
+      static int
+***************
+*** 3200,3205 ****
+--- 3242,3248 ----
+  	nr *= 10;
+  	nr += c - '0';
+  	++regparse;
++ 	curchr = -1; /* no longer valid */
+      }
+  
+      if (i == 0)
+***************
+*** 5432,5438 ****
+  		/* save the position after the found match for next */
+  		reg_save(&(((regbehind_T *)rp) - 1)->save_after, &backpos);
+  
+! 		/* start looking for a match with operand at the current
+  		 * position.  Go back one character until we find the
+  		 * result, hitting the start of the line or the previous
+  		 * line (for multi-line matching).
+--- 5475,5481 ----
+  		/* save the position after the found match for next */
+  		reg_save(&(((regbehind_T *)rp) - 1)->save_after, &backpos);
+  
+! 		/* Start looking for a match with operand at the current
+  		 * position.  Go back one character until we find the
+  		 * result, hitting the start of the line or the previous
+  		 * line (for multi-line matching).
+***************
+*** 5444,5450 ****
+  		rp->rs_state = RS_BEHIND2;
+  
+  		reg_restore(&rp->rs_un.regsave, &backpos);
+! 		scan = OPERAND(rp->rs_scan);
+  	    }
+  	    break;
+  
+--- 5487,5493 ----
+  		rp->rs_state = RS_BEHIND2;
+  
+  		reg_restore(&rp->rs_un.regsave, &backpos);
+! 		scan = OPERAND(rp->rs_scan) + 4;
+  	    }
+  	    break;
+  
+***************
+*** 5472,5480 ****
+--- 5515,5526 ----
+  	    }
+  	    else
+  	    {
++ 		long limit;
++ 
+  		/* No match or a match that doesn't end where we want it: Go
+  		 * back one character.  May go to previous line once. */
+  		no = OK;
++ 		limit = OPERAND_MIN(rp->rs_scan);
+  		if (REG_MULTI)
+  		{
+  		    if (rp->rs_un.regsave.rs_u.pos.col == 0)
+***************
+*** 5493,5519 ****
+  			}
+  		    }
+  		    else
+  #ifdef FEAT_MBYTE
+! 		    if (has_mbyte)
+! 			rp->rs_un.regsave.rs_u.pos.col -=
+! 			    (*mb_head_off)(regline, regline
+  				    + rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
+! 		    else
+  #endif
+! 			--rp->rs_un.regsave.rs_u.pos.col;
+  		}
+  		else
+  		{
+  		    if (rp->rs_un.regsave.rs_u.ptr == regline)
+  			no = FAIL;
+  		    else
+! 			--rp->rs_un.regsave.rs_u.ptr;
+  		}
+  		if (no == OK)
+  		{
+  		    /* Advanced, prepare for finding match again. */
+  		    reg_restore(&rp->rs_un.regsave, &backpos);
+! 		    scan = OPERAND(rp->rs_scan);
+  		    if (status == RA_MATCH)
+  		    {
+  			/* We did match, so subexpr may have been changed,
+--- 5539,5579 ----
+  			}
+  		    }
+  		    else
++ 		    {
+  #ifdef FEAT_MBYTE
+! 			if (has_mbyte)
+! 			    rp->rs_un.regsave.rs_u.pos.col -=
+! 				(*mb_head_off)(regline, regline
+  				    + rp->rs_un.regsave.rs_u.pos.col - 1) + 1;
+! 			else
+  #endif
+! 			    --rp->rs_un.regsave.rs_u.pos.col;
+! 			if (limit > 0
+! 				&& ((rp->rs_un.regsave.rs_u.pos.lnum
+! 						    < behind_pos.rs_u.pos.lnum
+! 					? (colnr_T)STRLEN(regline)
+! 					: behind_pos.rs_u.pos.col)
+! 				    - rp->rs_un.regsave.rs_u.pos.col > limit))
+! 			    no = FAIL;
+! 		    }
+  		}
+  		else
+  		{
+  		    if (rp->rs_un.regsave.rs_u.ptr == regline)
+  			no = FAIL;
+  		    else
+! 		    {
+! 			mb_ptr_back(regline, rp->rs_un.regsave.rs_u.ptr);
+! 			if (limit > 0 && (long)(behind_pos.rs_u.ptr
+! 				     - rp->rs_un.regsave.rs_u.ptr) > limit)
+! 			    no = FAIL;
+! 		    }
+  		}
+  		if (no == OK)
+  		{
+  		    /* Advanced, prepare for finding match again. */
+  		    reg_restore(&rp->rs_un.regsave, &backpos);
+! 		    scan = OPERAND(rp->rs_scan) + 4;
+  		    if (status == RA_MATCH)
+  		    {
+  			/* We did match, so subexpr may have been changed,
+***************
+*** 7773,7779 ****
+  #ifdef DEBUG
+  static char_u regname[][30] = {
+  		    "AUTOMATIC Regexp Engine",
+! 		    "BACKTACKING Regexp Engine",
+  		    "NFA Regexp Engine"
+  			    };
+  #endif
+--- 7833,7839 ----
+  #ifdef DEBUG
+  static char_u regname[][30] = {
+  		    "AUTOMATIC Regexp Engine",
+! 		    "BACKTRACKING Regexp Engine",
+  		    "NFA Regexp Engine"
+  			    };
+  #endif
+*** ../vim-7.3.1036/src/regexp_nfa.c	2013-05-28 22:52:11.000000000 +0200
+--- src/regexp_nfa.c	2013-05-29 16:31:13.000000000 +0200
+***************
+*** 1331,1336 ****
+--- 1331,1346 ----
+  		case '=':
+  		    EMIT(NFA_PREV_ATOM_NO_WIDTH);
+  		    break;
++ 		case '0':
++ 		case '1':
++ 		case '2':
++ 		case '3':
++ 		case '4':
++ 		case '5':
++ 		case '6':
++ 		case '7':
++ 		case '8':
++ 		case '9':
+  		case '!':
+  		case '<':
+  		case '>':
+***************
+*** 3817,3823 ****
+  	 * because recursive calls should only start in the first position.
+  	 * Also don't start a match past the first line. */
+  	if (nfa_match == FALSE && start->c == NFA_MOPEN + 0
+! 						 && reglnum == 0 && clen != 0)
+  	{
+  #ifdef ENABLE_LOG
+  	    fprintf(log_fd, "(---) STARTSTATE\n");
+--- 3827,3835 ----
+  	 * because recursive calls should only start in the first position.
+  	 * Also don't start a match past the first line. */
+  	if (nfa_match == FALSE && start->c == NFA_MOPEN + 0
+! 		&& reglnum == 0 && clen != 0
+! 		&& (ireg_maxcol == 0
+! 			      || (colnr_T)(reginput - regline) < ireg_maxcol))
+  	{
+  #ifdef ENABLE_LOG
+  	    fprintf(log_fd, "(---) STARTSTATE\n");
+*** ../vim-7.3.1036/src/testdir/test64.in	2013-05-28 22:03:13.000000000 +0200
+--- src/testdir/test64.in	2013-05-29 14:56:44.000000000 +0200
+***************
+*** 336,341 ****
+--- 336,349 ----
+  :"call add(tl, [2, '\(\i\+\) \1', 'xgoo goox', 'goo goo', 'goo'])
+  :call add(tl, [2, '\(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9', 'xabcddefghiabcddefghix', 'abcddefghiabcddefghi', 'a', 'b', 'c', 'dd', 'e', 'f', 'g', 'h', 'i'])
+  :"
++ :"""" Look-behind with limit
++ :call add(tl, [0, '<\@<=span.', 'xxspanxx<spanyyy', 'spany'])
++ :call add(tl, [0, '<\@1<=span.', 'xxspanxx<spanyyy', 'spany'])
++ :call add(tl, [0, '<\@2<=span.', 'xxspanxx<spanyyy', 'spany'])
++ :call add(tl, [0, '\(<<\)\@<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
++ :call add(tl, [0, '\(<<\)\@1<=span.', 'xxspanxxxx<spanxx<<spanyyy'])
++ :call add(tl, [0, '\(<<\)\@2<=span.', 'xxspanxxxx<spanxx<<spanyyy', 'spany', '<<'])
++ :"
+  :"""" Run the tests
+  :"
+  :"
+***************
+*** 406,411 ****
+--- 414,425 ----
+  y$Gop:"
+  :"
+  :"
++ :" Check a pattern with a look beind crossing a line boundary
++ /^Behind:
++ /\(<\_[xy]\+\)\@3<=start
++ :.yank
++ Gop:"
++ :"
+  :/\%#=1^Results/,$wq! test.out
+  ENDTEST
+  
+***************
+*** 423,426 ****
+--- 437,448 ----
+  xjk
+  lmn
+  
++ Behind:
++ asdfasd<yyy
++ xxstart1
++ asdfasd<yy
++ xxxxstart2
++ asdfasd<yy
++ xxxstart3
++ 
+  Results of test64:
+*** ../vim-7.3.1036/src/testdir/test64.ok	2013-05-28 22:03:13.000000000 +0200
+--- src/testdir/test64.ok	2013-05-29 14:59:37.000000000 +0200
+***************
+*** 719,724 ****
+--- 719,736 ----
+  OK 0 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9
+  OK 1 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9
+  OK 2 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9
++ OK 0 - <\@<=span.
++ OK 1 - <\@<=span.
++ OK 0 - <\@1<=span.
++ OK 1 - <\@1<=span.
++ OK 0 - <\@2<=span.
++ OK 1 - <\@2<=span.
++ OK 0 - \(<<\)\@<=span.
++ OK 1 - \(<<\)\@<=span.
++ OK 0 - \(<<\)\@1<=span.
++ OK 1 - \(<<\)\@1<=span.
++ OK 0 - \(<<\)\@2<=span.
++ OK 1 - \(<<\)\@2<=span.
+  192.168.0.1
+  192.168.0.1
+  192.168.0.1
+***************
+*** 726,728 ****
+--- 738,742 ----
+  <T="5">Ta 5</Title>
+  <T="7">Ac 7</Title>
+  ghi
++ 
++ xxxstart3
+*** ../vim-7.3.1036/src/version.c	2013-05-28 22:52:11.000000000 +0200
+--- src/version.c	2013-05-29 13:20:48.000000000 +0200
+***************
+*** 730,731 ****
+--- 730,733 ----
+  {   /* Add new patch number below this line */
++ /**/
++     1037,
+  /**/
+
+-- 
+hundred-and-one symptoms of being an internet addict:
+11. You find yourself typing "com" after every period when using a word
+    processor.com
+
+ /// Bram Moolenaar -- Bram at Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\  an exciting new programming language -- http://www.Zimbu.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///


More information about the scm-commits mailing list