[vim] - patchlevel 1106
Karsten Hopp
karsten at fedoraproject.org
Tue Jun 4 10:16:05 UTC 2013
commit 2dbc7a74e73664f32af918d60bdf2df7a10c6dc7
Author: Karsten Hopp <karsten at redhat.com>
Date: Tue Jun 4 12:06:59 2013 +0200
- patchlevel 1106
7.3.1106 | 383 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 383 insertions(+), 0 deletions(-)
---
diff --git a/7.3.1106 b/7.3.1106
new file mode 100644
index 0000000..801c007
--- /dev/null
+++ b/7.3.1106
@@ -0,0 +1,383 @@
+To: vim_dev at googlegroups.com
+Subject: Patch 7.3.1106
+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.1106
+Problem: New regexp engine: saving and restoring lastlist in the states
+ takes a lot of time.
+Solution: Use a second lastlist value for the first recursive call.
+Files: src/regexp.h, src/regexp_nfa.c
+
+
+*** ../vim-7.3.1105/src/regexp.h 2013-06-02 15:55:52.000000000 +0200
+--- src/regexp.h 2013-06-03 11:29:26.000000000 +0200
+***************
+*** 72,78 ****
+ nfa_state_T *out;
+ nfa_state_T *out1;
+ int id;
+! int lastlist;
+ int negated;
+ int val;
+ };
+--- 72,78 ----
+ nfa_state_T *out;
+ nfa_state_T *out1;
+ int id;
+! int lastlist[2]; /* 0: normal, 1: recursive */
+ int negated;
+ int val;
+ };
+*** ../vim-7.3.1105/src/regexp_nfa.c 2013-06-02 22:37:39.000000000 +0200
+--- src/regexp_nfa.c 2013-06-03 12:15:17.000000000 +0200
+***************
+*** 255,260 ****
+--- 255,269 ----
+ /* If not NULL match must end at this position */
+ static save_se_T *nfa_endp = NULL;
+
++ /* listid is global, so that it increases on recursive calls to
++ * nfa_regmatch(), which means we don't have to clear the lastlist field of
++ * all the states. */
++ static int nfa_listid;
++ static int nfa_alt_listid;
++
++ /* 0 for first call to nfa_regmatch(), 1 for recursive call. */
++ static int nfa_ll_index = 0;
++
+ static int nfa_regcomp_start __ARGS((char_u*expr, int re_flags));
+ static int nfa_recognize_char_class __ARGS((char_u *start, char_u *end, int extra_newl));
+ static int nfa_emit_equi_class __ARGS((int c, int neg));
+***************
+*** 2169,2175 ****
+ s->out1 = out1;
+
+ s->id = istate;
+! s->lastlist = 0;
+ s->negated = FALSE;
+
+ return s;
+--- 2178,2185 ----
+ s->out1 = out1;
+
+ s->id = istate;
+! s->lastlist[0] = 0;
+! s->lastlist[1] = 0;
+ s->negated = FALSE;
+
+ return s;
+***************
+*** 3113,3121 ****
+ #endif
+ /* These nodes do not need to be added, but we need to bail out
+ * when it was tried to be added to this list before. */
+! if (state->lastlist == l->id)
+ goto skip_add;
+! state->lastlist = l->id;
+ break;
+
+ case NFA_BOL:
+--- 3123,3131 ----
+ #endif
+ /* These nodes do not need to be added, but we need to bail out
+ * when it was tried to be added to this list before. */
+! if (state->lastlist[nfa_ll_index] == l->id)
+ goto skip_add;
+! state->lastlist[nfa_ll_index] = l->id;
+ break;
+
+ case NFA_BOL:
+***************
+*** 3131,3137 ****
+ /* FALLTHROUGH */
+
+ default:
+! if (state->lastlist == l->id)
+ {
+ /* This state is already in the list, don't add it again,
+ * unless it is an MOPEN that is used for a backreference. */
+--- 3141,3147 ----
+ /* FALLTHROUGH */
+
+ default:
+! if (state->lastlist[nfa_ll_index] == l->id)
+ {
+ /* This state is already in the list, don't add it again,
+ * unless it is an MOPEN that is used for a backreference. */
+***************
+*** 3173,3179 ****
+ }
+
+ /* add the state to the list */
+! state->lastlist = l->id;
+ thread = &l->t[l->n++];
+ thread->state = state;
+ copy_sub(&thread->subs.norm, &subs->norm);
+--- 3183,3189 ----
+ }
+
+ /* add the state to the list */
+! state->lastlist[nfa_ll_index] = l->id;
+ thread = &l->t[l->n++];
+ thread->state = state;
+ copy_sub(&thread->subs.norm, &subs->norm);
+***************
+*** 3616,3621 ****
+--- 3626,3632 ----
+ /*
+ * Save list IDs for all NFA states of "prog" into "list".
+ * Also reset the IDs to zero.
++ * Only used for the recursive value lastlist[1].
+ */
+ static void
+ nfa_save_listids(prog, list)
+***************
+*** 3629,3636 ****
+ p = &prog->state[0];
+ for (i = prog->nstate; --i >= 0; )
+ {
+! list[i] = p->lastlist;
+! p->lastlist = 0;
+ ++p;
+ }
+ }
+--- 3640,3647 ----
+ p = &prog->state[0];
+ for (i = prog->nstate; --i >= 0; )
+ {
+! list[i] = p->lastlist[1];
+! p->lastlist[1] = 0;
+ ++p;
+ }
+ }
+***************
+*** 3649,3655 ****
+ p = &prog->state[0];
+ for (i = prog->nstate; --i >= 0; )
+ {
+! p->lastlist = list[i];
+ ++p;
+ }
+ }
+--- 3660,3666 ----
+ p = &prog->state[0];
+ for (i = prog->nstate; --i >= 0; )
+ {
+! p->lastlist[1] = list[i];
+ ++p;
+ }
+ }
+***************
+*** 3683,3692 ****
+--- 3694,3705 ----
+ char_u *save_regline = regline;
+ int save_reglnum = reglnum;
+ int save_nfa_match = nfa_match;
++ int save_nfa_listid = nfa_listid;
+ save_se_T *save_nfa_endp = nfa_endp;
+ save_se_T endpos;
+ save_se_T *endposp = NULL;
+ int result;
++ int need_restore = FALSE;
+
+ if (state->c == NFA_START_INVISIBLE_BEFORE)
+ {
+***************
+*** 3745,3774 ****
+ }
+ }
+
+- /* Call nfa_regmatch() to check if the current concat matches
+- * at this position. The concat ends with the node
+- * NFA_END_INVISIBLE */
+- if (*listids == NULL)
+- {
+- *listids = (int *)lalloc(sizeof(int) * nstate, TRUE);
+- if (*listids == NULL)
+- {
+- EMSG(_("E878: (NFA) Could not allocate memory for branch traversal!"));
+- return 0;
+- }
+- }
+ #ifdef ENABLE_LOG
+ if (log_fd != stderr)
+ fclose(log_fd);
+ log_fd = NULL;
+ #endif
+! /* Have to clear the listid field of the NFA nodes, so that
+! * nfa_regmatch() and addstate() can run properly after
+! * recursion. */
+! nfa_save_listids(prog, *listids);
+ nfa_endp = endposp;
+ result = nfa_regmatch(prog, state->out, submatch, m);
+! nfa_restore_listids(prog, *listids);
+
+ /* restore position in input text */
+ reginput = save_reginput;
+--- 3758,3809 ----
+ }
+ }
+
+ #ifdef ENABLE_LOG
+ if (log_fd != stderr)
+ fclose(log_fd);
+ log_fd = NULL;
+ #endif
+! /* Have to clear the lastlist field of the NFA nodes, so that
+! * nfa_regmatch() and addstate() can run properly after recursion. */
+! if (nfa_ll_index == 1)
+! {
+! /* Already calling nfa_regmatch() recursively. Save the lastlist[1]
+! * values and clear them. */
+! if (*listids == NULL)
+! {
+! *listids = (int *)lalloc(sizeof(int) * nstate, TRUE);
+! if (*listids == NULL)
+! {
+! EMSG(_("E878: (NFA) Could not allocate memory for branch traversal!"));
+! return 0;
+! }
+! }
+! nfa_save_listids(prog, *listids);
+! need_restore = TRUE;
+! /* any value of nfa_listid will do */
+! }
+! else
+! {
+! /* First recursive nfa_regmatch() call, switch to the second lastlist
+! * entry. Make sure nfa_listid is different from a previous recursive
+! * call, because some states may still have this ID. */
+! ++nfa_ll_index;
+! if (nfa_listid <= nfa_alt_listid)
+! nfa_listid = nfa_alt_listid;
+! }
+!
+! /* Call nfa_regmatch() to check if the current concat matches at this
+! * position. The concat ends with the node NFA_END_INVISIBLE */
+ nfa_endp = endposp;
+ result = nfa_regmatch(prog, state->out, submatch, m);
+!
+! if (need_restore)
+! nfa_restore_listids(prog, *listids);
+! else
+! {
+! --nfa_ll_index;
+! nfa_alt_listid = nfa_listid;
+! }
+
+ /* restore position in input text */
+ reginput = save_reginput;
+***************
+*** 3776,3781 ****
+--- 3811,3817 ----
+ reglnum = save_reglnum;
+ nfa_match = save_nfa_match;
+ nfa_endp = save_nfa_endp;
++ nfa_listid = save_nfa_listid;
+
+ #ifdef ENABLE_LOG
+ log_fd = fopen(NFA_REGEXP_RUN_LOG, "a");
+***************
+*** 3821,3827 ****
+ nfa_list_T list[3];
+ nfa_list_T *listtbl[2][2];
+ nfa_list_T *ll;
+- int listid = 1;
+ int listidx;
+ nfa_list_T *thislist;
+ nfa_list_T *nextlist;
+--- 3857,3862 ----
+***************
+*** 3875,3881 ****
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "(---) STARTSTATE\n");
+ #endif
+! thislist->id = listid;
+ addstate(thislist, start, m, 0);
+
+ /* There are two cases when the NFA advances: 1. input char matches the
+--- 3910,3916 ----
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "(---) STARTSTATE\n");
+ #endif
+! thislist->id = nfa_listid + 1;
+ addstate(thislist, start, m, 0);
+
+ /* There are two cases when the NFA advances: 1. input char matches the
+***************
+*** 3923,3932 ****
+ nextlist = &list[flag ^= 1];
+ nextlist->n = 0; /* clear nextlist */
+ listtbl[1][0] = nextlist;
+! ++listid;
+! thislist->id = listid;
+! nextlist->id = listid + 1;
+! neglist->id = listid + 1;
+
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "------------------------------------------\n");
+--- 3958,3967 ----
+ nextlist = &list[flag ^= 1];
+ nextlist->n = 0; /* clear nextlist */
+ listtbl[1][0] = nextlist;
+! ++nfa_listid;
+! thislist->id = nfa_listid;
+! nextlist->id = nfa_listid + 1;
+! neglist->id = nfa_listid + 1;
+
+ #ifdef ENABLE_LOG
+ fprintf(log_fd, "------------------------------------------\n");
+***************
+*** 4843,4848 ****
+--- 4878,4885 ----
+ nfa_has_zend = prog->has_zend;
+ nfa_has_backref = prog->has_backref;
+ nfa_nsubexpr = prog->nsubexp;
++ nfa_listid = 1;
++ nfa_alt_listid = 2;
+ #ifdef DEBUG
+ nfa_regengine.expr = prog->pattern;
+ #endif
+***************
+*** 4851,4857 ****
+ for (i = 0; i < nstate; ++i)
+ {
+ prog->state[i].id = i;
+! prog->state[i].lastlist = 0;
+ }
+
+ retval = nfa_regtry(prog, col);
+--- 4888,4895 ----
+ for (i = 0; i < nstate; ++i)
+ {
+ prog->state[i].id = i;
+! prog->state[i].lastlist[0] = 0;
+! prog->state[i].lastlist[1] = 0;
+ }
+
+ retval = nfa_regtry(prog, col);
+*** ../vim-7.3.1105/src/version.c 2013-06-02 22:37:39.000000000 +0200
+--- src/version.c 2013-06-03 12:13:15.000000000 +0200
+***************
+*** 730,731 ****
+--- 730,733 ----
+ { /* Add new patch number below this line */
++ /**/
++ 1106,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+59. Your wife says communication is important in a marriage...so you buy
+ another computer and install a second phone line so the two of you can
+ chat.
+
+ /// 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