From a4509a4388822a8c7c7e198c96953ded4bde7deb Mon Sep 17 00:00:00 2001 From: Karsten Hopp Date: Jan 27 2015 17:00:10 +0000 Subject: - patchlevel 600 --- diff --git a/7.4.600 b/7.4.600 new file mode 100644 index 0000000..96da451 --- /dev/null +++ b/7.4.600 @@ -0,0 +1,546 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.4.600 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.4.600 +Problem: Memory wasted in struct because of aligning. +Solution: Split pos in lnum and col. (Dominique Pelle) +Files: src/regexp_nfa.c + + +*** ../vim-7.4.599/src/regexp_nfa.c 2015-01-27 14:39:55.661913204 +0100 +--- src/regexp_nfa.c 2015-01-27 14:43:04.323847916 +0100 +*************** +*** 1456,1462 **** + * matched an unlimited number of times. NFA_NOPEN is + * added only once at a position, while NFA_SPLIT is + * added multiple times. This is more efficient than +! * not allowsing NFA_SPLIT multiple times, it is used + * a lot. */ + EMIT(NFA_NOPEN); + break; +--- 1456,1462 ---- + * matched an unlimited number of times. NFA_NOPEN is + * added only once at a position, while NFA_SPLIT is + * added multiple times. This is more efficient than +! * not allowing NFA_SPLIT multiple times, it is used + * a lot. */ + EMIT(NFA_NOPEN); + break; +*************** +*** 3726,3733 **** + { + struct multipos + { +! lpos_T start; +! lpos_T end; + } multi[NSUBEXP]; + struct linepos + { +--- 3726,3735 ---- + { + struct multipos + { +! linenr_T start_lnum; +! linenr_T end_lnum; +! colnr_T start_col; +! colnr_T end_col; + } multi[NSUBEXP]; + struct linepos + { +*************** +*** 3812,3821 **** + if (REG_MULTI) + fprintf(log_fd, "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n", + j, +! sub->list.multi[j].start.col, +! (int)sub->list.multi[j].start.lnum, +! sub->list.multi[j].end.col, +! (int)sub->list.multi[j].end.lnum); + else + { + char *s = (char *)sub->list.line[j].start; +--- 3814,3823 ---- + if (REG_MULTI) + fprintf(log_fd, "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n", + j, +! sub->list.multi[j].start_col, +! (int)sub->list.multi[j].start_lnum, +! sub->list.multi[j].end_col, +! (int)sub->list.multi[j].end_lnum); + else + { + char *s = (char *)sub->list.line[j].start; +*************** +*** 3952,3959 **** + { + if (REG_MULTI) + { +! if (from->list.multi[0].end.lnum >= 0) +! to->list.multi[0].end = from->list.multi[0].end; + } + else + { +--- 3954,3964 ---- + { + if (REG_MULTI) + { +! if (from->list.multi[0].end_lnum >= 0) +! { +! to->list.multi[0].end_lnum = from->list.multi[0].end_lnum; +! to->list.multi[0].end_col = from->list.multi[0].end_col; +! } + } + else + { +*************** +*** 3985,4017 **** + for (i = 0; i < todo; ++i) + { + if (i < sub1->in_use) +! s1 = sub1->list.multi[i].start.lnum; + else + s1 = -1; + if (i < sub2->in_use) +! s2 = sub2->list.multi[i].start.lnum; + else + s2 = -1; + if (s1 != s2) + return FALSE; +! if (s1 != -1 && sub1->list.multi[i].start.col +! != sub2->list.multi[i].start.col) + return FALSE; + + if (nfa_has_backref) + { + if (i < sub1->in_use) +! s1 = sub1->list.multi[i].end.lnum; + else + s1 = -1; + if (i < sub2->in_use) +! s2 = sub2->list.multi[i].end.lnum; + else + s2 = -1; + if (s1 != s2) + return FALSE; +! if (s1 != -1 && sub1->list.multi[i].end.col +! != sub2->list.multi[i].end.col) + return FALSE; + } + } +--- 3990,4022 ---- + for (i = 0; i < todo; ++i) + { + if (i < sub1->in_use) +! s1 = sub1->list.multi[i].start_lnum; + else + s1 = -1; + if (i < sub2->in_use) +! s2 = sub2->list.multi[i].start_lnum; + else + s2 = -1; + if (s1 != s2) + return FALSE; +! if (s1 != -1 && sub1->list.multi[i].start_col +! != sub2->list.multi[i].start_col) + return FALSE; + + if (nfa_has_backref) + { + if (i < sub1->in_use) +! s1 = sub1->list.multi[i].end_lnum; + else + s1 = -1; + if (i < sub2->in_use) +! s2 = sub2->list.multi[i].end_lnum; + else + s2 = -1; + if (s1 != s2) + return FALSE; +! if (s1 != -1 && sub1->list.multi[i].end_col +! != sub2->list.multi[i].end_col) + return FALSE; + } + } +*************** +*** 4062,4068 **** + if (sub->in_use <= 0) + col = -1; + else if (REG_MULTI) +! col = sub->list.multi[0].start.col; + else + col = (int)(sub->list.line[0].start - regline); + nfa_set_code(state->c); +--- 4067,4073 ---- + if (sub->in_use <= 0) + col = -1; + else if (REG_MULTI) +! col = sub->list.multi[0].start_col; + else + col = (int)(sub->list.line[0].start - regline); + nfa_set_code(state->c); +*************** +*** 4482,4488 **** + { + if (subidx < sub->in_use) + { +! save_lpos = sub->list.multi[subidx].start; + save_in_use = -1; + } + else +--- 4487,4494 ---- + { + if (subidx < sub->in_use) + { +! save_lpos.lnum = sub->list.multi[subidx].start_lnum; +! save_lpos.col = sub->list.multi[subidx].start_col; + save_in_use = -1; + } + else +*************** +*** 4490,4509 **** + save_in_use = sub->in_use; + for (i = sub->in_use; i < subidx; ++i) + { +! sub->list.multi[i].start.lnum = -1; +! sub->list.multi[i].end.lnum = -1; + } + sub->in_use = subidx + 1; + } + if (off == -1) + { +! sub->list.multi[subidx].start.lnum = reglnum + 1; +! sub->list.multi[subidx].start.col = 0; + } + else + { +! sub->list.multi[subidx].start.lnum = reglnum; +! sub->list.multi[subidx].start.col = + (colnr_T)(reginput - regline + off); + } + } +--- 4496,4515 ---- + save_in_use = sub->in_use; + for (i = sub->in_use; i < subidx; ++i) + { +! sub->list.multi[i].start_lnum = -1; +! sub->list.multi[i].end_lnum = -1; + } + sub->in_use = subidx + 1; + } + if (off == -1) + { +! sub->list.multi[subidx].start_lnum = reglnum + 1; +! sub->list.multi[subidx].start_col = 0; + } + else + { +! sub->list.multi[subidx].start_lnum = reglnum; +! sub->list.multi[subidx].start_col = + (colnr_T)(reginput - regline + off); + } + } +*************** +*** 4539,4545 **** + if (save_in_use == -1) + { + if (REG_MULTI) +! sub->list.multi[subidx].start = save_lpos; + else + sub->list.line[subidx].start = save_ptr; + } +--- 4545,4554 ---- + if (save_in_use == -1) + { + if (REG_MULTI) +! { +! sub->list.multi[subidx].start_lnum = save_lpos.lnum; +! sub->list.multi[subidx].start_col = save_lpos.col; +! } + else + sub->list.line[subidx].start = save_ptr; + } +*************** +*** 4549,4555 **** + + case NFA_MCLOSE: + if (nfa_has_zend && (REG_MULTI +! ? subs->norm.list.multi[0].end.lnum >= 0 + : subs->norm.list.line[0].end != NULL)) + { + /* Do not overwrite the position set by \ze. */ +--- 4558,4564 ---- + + case NFA_MCLOSE: + if (nfa_has_zend && (REG_MULTI +! ? subs->norm.list.multi[0].end_lnum >= 0 + : subs->norm.list.line[0].end != NULL)) + { + /* Do not overwrite the position set by \ze. */ +*************** +*** 4603,4618 **** + sub->in_use = subidx + 1; + if (REG_MULTI) + { +! save_lpos = sub->list.multi[subidx].end; + if (off == -1) + { +! sub->list.multi[subidx].end.lnum = reglnum + 1; +! sub->list.multi[subidx].end.col = 0; + } + else + { +! sub->list.multi[subidx].end.lnum = reglnum; +! sub->list.multi[subidx].end.col = + (colnr_T)(reginput - regline + off); + } + /* avoid compiler warnings */ +--- 4612,4628 ---- + sub->in_use = subidx + 1; + if (REG_MULTI) + { +! save_lpos.lnum = sub->list.multi[subidx].end_lnum; +! save_lpos.col = sub->list.multi[subidx].end_col; + if (off == -1) + { +! sub->list.multi[subidx].end_lnum = reglnum + 1; +! sub->list.multi[subidx].end_col = 0; + } + else + { +! sub->list.multi[subidx].end_lnum = reglnum; +! sub->list.multi[subidx].end_col = + (colnr_T)(reginput - regline + off); + } + /* avoid compiler warnings */ +*************** +*** 4637,4643 **** + sub = &subs->norm; + + if (REG_MULTI) +! sub->list.multi[subidx].end = save_lpos; + else + sub->list.line[subidx].end = save_ptr; + sub->in_use = save_in_use; +--- 4647,4656 ---- + sub = &subs->norm; + + if (REG_MULTI) +! { +! sub->list.multi[subidx].end_lnum = save_lpos.lnum; +! sub->list.multi[subidx].end_col = save_lpos.col; +! } + else + sub->list.line[subidx].end = save_ptr; + sub->in_use = save_in_use; +*************** +*** 4825,4839 **** + + if (REG_MULTI) + { +! if (sub->list.multi[subidx].start.lnum < 0 +! || sub->list.multi[subidx].end.lnum < 0) + goto retempty; +! if (sub->list.multi[subidx].start.lnum == reglnum +! && sub->list.multi[subidx].end.lnum == reglnum) + { +! len = sub->list.multi[subidx].end.col +! - sub->list.multi[subidx].start.col; +! if (cstrncmp(regline + sub->list.multi[subidx].start.col, + reginput, &len) == 0) + { + *bytelen = len; +--- 4838,4852 ---- + + if (REG_MULTI) + { +! if (sub->list.multi[subidx].start_lnum < 0 +! || sub->list.multi[subidx].end_lnum < 0) + goto retempty; +! if (sub->list.multi[subidx].start_lnum == reglnum +! && sub->list.multi[subidx].end_lnum == reglnum) + { +! len = sub->list.multi[subidx].end_col +! - sub->list.multi[subidx].start_col; +! if (cstrncmp(regline + sub->list.multi[subidx].start_col, + reginput, &len) == 0) + { + *bytelen = len; +*************** +*** 4843,4852 **** + else + { + if (match_with_backref( +! sub->list.multi[subidx].start.lnum, +! sub->list.multi[subidx].start.col, +! sub->list.multi[subidx].end.lnum, +! sub->list.multi[subidx].end.col, + bytelen) == RA_MATCH) + return TRUE; + } +--- 4856,4865 ---- + else + { + if (match_with_backref( +! sub->list.multi[subidx].start_lnum, +! sub->list.multi[subidx].start_col, +! sub->list.multi[subidx].end_lnum, +! sub->list.multi[subidx].end_col, + bytelen) == RA_MATCH) + return TRUE; + } +*************** +*** 5441,5446 **** +--- 5454,5460 ---- + + /* Allocate memory for the lists of nodes. */ + size = (nstate + 1) * sizeof(nfa_thread_T); ++ + list[0].t = (nfa_thread_T *)lalloc(size, TRUE); + list[0].len = nstate + 1; + list[1].t = (nfa_thread_T *)lalloc(size, TRUE); +*************** +*** 5482,5489 **** + { + if (REG_MULTI) + { +! m->norm.list.multi[0].start.lnum = reglnum; +! m->norm.list.multi[0].start.col = (colnr_T)(reginput - regline); + } + else + m->norm.list.line[0].start = reginput; +--- 5496,5503 ---- + { + if (REG_MULTI) + { +! m->norm.list.multi[0].start_lnum = reglnum; +! m->norm.list.multi[0].start_col = (colnr_T)(reginput - regline); + } + else + m->norm.list.line[0].start = reginput; +*************** +*** 5580,5586 **** + if (t->subs.norm.in_use <= 0) + col = -1; + else if (REG_MULTI) +! col = t->subs.norm.list.multi[0].start.col; + else + col = (int)(t->subs.norm.list.line[0].start - regline); + nfa_set_code(t->state->c); +--- 5594,5600 ---- + if (t->subs.norm.in_use <= 0) + col = -1; + else if (REG_MULTI) +! col = t->subs.norm.list.multi[0].start_col; + else + col = (int)(t->subs.norm.list.line[0].start - regline); + nfa_set_code(t->state->c); +*************** +*** 5861,5867 **** + * continue with what follows. */ + if (REG_MULTI) + /* TODO: multi-line match */ +! bytelen = m->norm.list.multi[0].end.col + - (int)(reginput - regline); + else + bytelen = (int)(m->norm.list.line[0].end - reginput); +--- 5875,5881 ---- + * continue with what follows. */ + if (REG_MULTI) + /* TODO: multi-line match */ +! bytelen = m->norm.list.multi[0].end_col + - (int)(reginput - regline); + else + bytelen = (int)(m->norm.list.line[0].end - reginput); +*************** +*** 6741,6747 **** + if (add) + { + if (REG_MULTI) +! m->norm.list.multi[0].start.col = + (colnr_T)(reginput - regline) + clen; + else + m->norm.list.line[0].start = reginput + clen; +--- 6755,6761 ---- + if (add) + { + if (REG_MULTI) +! m->norm.list.multi[0].start_col = + (colnr_T)(reginput - regline) + clen; + else + m->norm.list.line[0].start = reginput + clen; +*************** +*** 6854,6861 **** + { + for (i = 0; i < subs.norm.in_use; i++) + { +! reg_startpos[i] = subs.norm.list.multi[i].start; +! reg_endpos[i] = subs.norm.list.multi[i].end; + } + + if (reg_startpos[0].lnum < 0) +--- 6868,6878 ---- + { + for (i = 0; i < subs.norm.in_use; i++) + { +! reg_startpos[i].lnum = subs.norm.list.multi[i].start_lnum; +! reg_startpos[i].col = subs.norm.list.multi[i].start_col; +! +! reg_endpos[i].lnum = subs.norm.list.multi[i].end_lnum; +! reg_endpos[i].col = subs.norm.list.multi[i].end_col; + } + + if (reg_startpos[0].lnum < 0) +*************** +*** 6903,6915 **** + struct multipos *mpos = &subs.synt.list.multi[i]; + + /* Only accept single line matches that are valid. */ +! if (mpos->start.lnum >= 0 +! && mpos->start.lnum == mpos->end.lnum +! && mpos->end.col >= mpos->start.col) + re_extmatch_out->matches[i] = +! vim_strnsave(reg_getline(mpos->start.lnum) +! + mpos->start.col, +! mpos->end.col - mpos->start.col); + } + else + { +--- 6920,6932 ---- + struct multipos *mpos = &subs.synt.list.multi[i]; + + /* Only accept single line matches that are valid. */ +! if (mpos->start_lnum >= 0 +! && mpos->start_lnum == mpos->end_lnum +! && mpos->end_col >= mpos->start_col) + re_extmatch_out->matches[i] = +! vim_strnsave(reg_getline(mpos->start_lnum) +! + mpos->start_col, +! mpos->end_col - mpos->start_col); + } + else + { +*** ../vim-7.4.599/src/version.c 2015-01-27 14:39:55.661913204 +0100 +--- src/version.c 2015-01-27 14:44:06.739164665 +0100 +*************** +*** 743,744 **** +--- 743,746 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 600, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +126. You brag to all of your friends about your date Saturday night...but + you don't tell them it was only in a chat room. + + /// Bram Moolenaar -- Bram@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 ///