changeset 4541:80170d61a85c v7.3.1018

updated for version 7.3.1018 Problem: New regexp engine wastes memory. Solution: Allocate prog with actual number of states, not estimated maximum number of sates.
author Bram Moolenaar <bram@vim.org>
date Sat, 25 May 2013 21:18:34 +0200
parents bf942f74d21b
children c02661ad95f8
files src/regexp_nfa.c src/version.c
diffstat 2 files changed, 11 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -3758,7 +3758,7 @@ nfa_regcomp(expr, re_flags)
     char_u	*expr;
     int		re_flags;
 {
-    nfa_regprog_T	*prog;
+    nfa_regprog_T	*prog = NULL;
     size_t		prog_size;
     int			*postfix;
 
@@ -3774,15 +3774,8 @@ nfa_regcomp(expr, re_flags)
     if (nfa_regcomp_start(expr, re_flags) == FAIL)
 	return NULL;
 
-    /* Space for compiled regexp */
-    prog_size = sizeof(nfa_regprog_T) + sizeof(nfa_state_T) * nstate_max;
-    prog = (nfa_regprog_T *)lalloc(prog_size, TRUE);
-    if (prog == NULL)
-	goto fail;
-    vim_memset(prog, 0, prog_size);
-
     /* Build postfix form of the regexp. Needed to build the NFA
-     * (and count its size) */
+     * (and count its size). */
     postfix = re2post();
     if (postfix == NULL)
 	goto fail;	    /* Cascaded (syntax?) error */
@@ -3809,6 +3802,13 @@ nfa_regcomp(expr, re_flags)
      * Count number of NFA states in "nstate". Do not build the NFA.
      */
     post2nfa(postfix, post_ptr, TRUE);
+
+    /* Space for compiled regexp */
+    prog_size = sizeof(nfa_regprog_T) + sizeof(nfa_state_T) * nstate;
+    prog = (nfa_regprog_T *)lalloc(prog_size, TRUE);
+    if (prog == NULL)
+	goto fail;
+    vim_memset(prog, 0, prog_size);
     state_ptr = prog->state;
 
     /*
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1018,
+/**/
     1017,
 /**/
     1016,