From dffa5b8ecfa2091495b77ab487c07792646d0633 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 19 Nov 2014 16:38:07 +0100 Subject: updated for version 7.4.519 Problem: Crash when using syntax highlighting. Solution: When regprog is freed and replaced, store the result. --- src/spell.c | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'src/spell.c') diff --git a/src/spell.c b/src/spell.c index 1e52dfb26..9d7f933a2 100644 --- a/src/spell.c +++ b/src/spell.c @@ -1154,11 +1154,14 @@ spell_check(wp, ptr, attrp, capcol, docount) if (capcol != NULL && wp->w_s->b_cap_prog != NULL) { regmatch_T regmatch; + int r; /* Check for end of sentence. */ regmatch.regprog = wp->w_s->b_cap_prog; regmatch.rm_ic = FALSE; - if (vim_regexec(®match, ptr, 0)) + r = vim_regexec(®match, ptr, 0); + wp->w_s->b_cap_prog = regmatch.regprog; + if (r) *capcol = (int)(regmatch.endp[0] - ptr); } @@ -1786,7 +1789,6 @@ can_compound(slang, word, flags) char_u *word; char_u *flags; { - regmatch_T regmatch; #ifdef FEAT_MBYTE char_u uflags[MAXWLEN * 2]; int i; @@ -1808,9 +1810,7 @@ can_compound(slang, word, flags) else #endif p = flags; - regmatch.regprog = slang->sl_compprog; - regmatch.rm_ic = FALSE; - if (!vim_regexec(®match, p, 0)) + if (!vim_regexec_prog(&slang->sl_compprog, FALSE, p, 0)) return FALSE; /* Count the number of syllables. This may be slow, do it last. If there @@ -1930,8 +1930,7 @@ valid_word_prefix(totprefcnt, arridx, flags, word, slang, cond_req) { int prefcnt; int pidx; - regprog_T *rp; - regmatch_T regmatch; + regprog_T **rp; int prefid; prefid = (unsigned)flags >> 24; @@ -1950,12 +1949,10 @@ valid_word_prefix(totprefcnt, arridx, flags, word, slang, cond_req) /* Check the condition, if there is one. The condition index is * stored in the two bytes above the prefix ID byte. */ - rp = slang->sl_prefprog[((unsigned)pidx >> 8) & 0xffff]; - if (rp != NULL) + rp = &slang->sl_prefprog[((unsigned)pidx >> 8) & 0xffff]; + if (*rp != NULL) { - regmatch.regprog = rp; - regmatch.rm_ic = FALSE; - if (!vim_regexec(®match, word, 0)) + if (!vim_regexec_prog(rp, FALSE, word, 0)) continue; } else if (cond_req) @@ -6903,7 +6900,6 @@ store_aff_word(spin, word, afflist, affile, ht, xht, condit, flags, hashitem_T *hi; affheader_T *ah; affentry_T *ae; - regmatch_T regmatch; char_u newword[MAXWLEN]; int retval = OK; int i, j; @@ -6944,15 +6940,14 @@ store_aff_word(spin, word, afflist, affile, ht, xht, condit, flags, * When a previously added affix had CIRCUMFIX this one * must have it too, if it had not then this one must not * have one either. */ - regmatch.regprog = ae->ae_prog; - regmatch.rm_ic = FALSE; if ((xht != NULL || !affile->af_pfxpostpone || ae->ae_chop != NULL || ae->ae_flags != NULL) && (ae->ae_chop == NULL || STRLEN(ae->ae_chop) < wordlen) && (ae->ae_prog == NULL - || vim_regexec(®match, word, (colnr_T)0)) + || vim_regexec_prog(&ae->ae_prog, FALSE, + word, (colnr_T)0)) && (((condit & CONDIT_CFIX) == 0) == ((condit & CONDIT_AFF) == 0 || ae->ae_flags == NULL @@ -10478,6 +10473,7 @@ check_need_cap(lnum, col) break; } } + curwin->w_s->b_cap_prog = regmatch.regprog; } vim_free(line_copy); -- cgit v1.2.1