Mercurial > vim
changeset 5058:a00cd1839ac4 v7.3.1272
updated for version 7.3.1272
Problem: Crash when editing Ruby file. (Aliaksandr Rahalevich)
Solution: Reallocate the state list when necessary.
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Sun, 30 Jun 2013 13:17:24 +0200 |
parents | e5f776a5fa12 |
children | 5dda3745e997 |
files | src/regexp_nfa.c src/version.c |
diffstat | 2 files changed, 35 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -4228,14 +4228,39 @@ addstate_here(l, state, subs, pim, ip) } else if (count > 1) { - /* make space for new states, then move them from the - * end to the current position */ - mch_memmove(&(l->t[listidx + count]), - &(l->t[listidx + 1]), - sizeof(nfa_thread_T) * (l->n - listidx - 1)); - mch_memmove(&(l->t[listidx]), - &(l->t[l->n - 1]), - sizeof(nfa_thread_T) * count); + if (l->n + count - 1 >= l->len) + { + /* not enough space to move the new states, reallocate the list + * and move the states to the right position */ + nfa_thread_T *newl; + + l->len = l->len * 3 / 2 + 50; + newl = (nfa_thread_T *)alloc(l->len * sizeof(nfa_thread_T)); + if (newl == NULL) + return; + mch_memmove(&(newl[0]), + &(l->t[0]), + sizeof(nfa_thread_T) * listidx); + mch_memmove(&(newl[listidx]), + &(l->t[l->n - count]), + sizeof(nfa_thread_T) * count); + mch_memmove(&(newl[listidx + count]), + &(l->t[listidx + 1]), + sizeof(nfa_thread_T) * (l->n - count - listidx - 1)); + vim_free(l->t); + l->t = newl; + } + else + { + /* make space for new states, then move them from the + * end to the current position */ + mch_memmove(&(l->t[listidx + count]), + &(l->t[listidx + 1]), + sizeof(nfa_thread_T) * (l->n - listidx - 1)); + mch_memmove(&(l->t[listidx]), + &(l->t[l->n - 1]), + sizeof(nfa_thread_T) * count); + } } --l->n; *ip = listidx - 1;