mirror of
https://github.com/neovim/neovim.git
synced 2025-09-22 11:18:19 +00:00
vim-patch:7.4.600 #3081
Problem: Memory wasted in struct because of aligning. Solution: Split pos in lnum and col. (Dominique Pelle) https://github.com/vim/vim/commit/v7-4-600
This commit is contained in:

committed by
Justin M. Keyes

parent
ccebc1f8d3
commit
d4396acedb
@@ -270,8 +270,10 @@ typedef struct {
|
|||||||
/* When REG_MULTI is TRUE list.multi is used, otherwise list.line. */
|
/* When REG_MULTI is TRUE list.multi is used, otherwise list.line. */
|
||||||
union {
|
union {
|
||||||
struct multipos {
|
struct multipos {
|
||||||
lpos_T start;
|
linenr_T start_lnum;
|
||||||
lpos_T end;
|
linenr_T end_lnum;
|
||||||
|
colnr_T start_col;
|
||||||
|
colnr_T end_col;
|
||||||
} multi[NSUBEXP];
|
} multi[NSUBEXP];
|
||||||
struct linepos {
|
struct linepos {
|
||||||
char_u *start;
|
char_u *start;
|
||||||
@@ -1391,7 +1393,7 @@ static int nfa_regatom(void)
|
|||||||
* matched an unlimited number of times. NFA_NOPEN is
|
* matched an unlimited number of times. NFA_NOPEN is
|
||||||
* added only once at a position, while NFA_SPLIT is
|
* added only once at a position, while NFA_SPLIT is
|
||||||
* added multiple times. This is more efficient than
|
* added multiple times. This is more efficient than
|
||||||
* not allowsing NFA_SPLIT multiple times, it is used
|
* not allowing NFA_SPLIT multiple times, it is used
|
||||||
* a lot. */
|
* a lot. */
|
||||||
EMIT(NFA_NOPEN);
|
EMIT(NFA_NOPEN);
|
||||||
break;
|
break;
|
||||||
@@ -3431,10 +3433,10 @@ static void log_subexpr(regsub_T *sub)
|
|||||||
if (REG_MULTI)
|
if (REG_MULTI)
|
||||||
fprintf(log_fd, "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n",
|
fprintf(log_fd, "*** group %d, start: c=%d, l=%d, end: c=%d, l=%d\n",
|
||||||
j,
|
j,
|
||||||
sub->list.multi[j].start.col,
|
sub->list.multi[j].start_col,
|
||||||
(int)sub->list.multi[j].start.lnum,
|
(int)sub->list.multi[j].start_lnum,
|
||||||
sub->list.multi[j].end.col,
|
sub->list.multi[j].end_col,
|
||||||
(int)sub->list.multi[j].end.lnum);
|
(int)sub->list.multi[j].end_lnum);
|
||||||
else {
|
else {
|
||||||
char *s = (char *)sub->list.line[j].start;
|
char *s = (char *)sub->list.line[j].start;
|
||||||
char *e = (char *)sub->list.line[j].end;
|
char *e = (char *)sub->list.line[j].end;
|
||||||
@@ -3535,8 +3537,10 @@ static void copy_ze_off(regsub_T *to, regsub_T *from)
|
|||||||
{
|
{
|
||||||
if (nfa_has_zend) {
|
if (nfa_has_zend) {
|
||||||
if (REG_MULTI) {
|
if (REG_MULTI) {
|
||||||
if (from->list.multi[0].end.lnum >= 0)
|
if (from->list.multi[0].end_lnum >= 0){
|
||||||
to->list.multi[0].end = from->list.multi[0].end;
|
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 {
|
} else {
|
||||||
if (from->list.line[0].end != NULL)
|
if (from->list.line[0].end != NULL)
|
||||||
to->list.line[0].end = from->list.line[0].end;
|
to->list.line[0].end = from->list.line[0].end;
|
||||||
@@ -3559,27 +3563,27 @@ static int sub_equal(regsub_T *sub1, regsub_T *sub2)
|
|||||||
if (REG_MULTI) {
|
if (REG_MULTI) {
|
||||||
for (i = 0; i < todo; ++i) {
|
for (i = 0; i < todo; ++i) {
|
||||||
if (i < sub1->in_use)
|
if (i < sub1->in_use)
|
||||||
s1 = sub1->list.multi[i].start.lnum;
|
s1 = sub1->list.multi[i].start_lnum;
|
||||||
else
|
else
|
||||||
s1 = -1;
|
s1 = -1;
|
||||||
if (i < sub2->in_use)
|
if (i < sub2->in_use)
|
||||||
s2 = sub2->list.multi[i].start.lnum;
|
s2 = sub2->list.multi[i].start_lnum;
|
||||||
else
|
else
|
||||||
s2 = -1;
|
s2 = -1;
|
||||||
if (s1 != s2)
|
if (s1 != s2)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (s1 != -1 && sub1->list.multi[i].start.col
|
if (s1 != -1 && sub1->list.multi[i].start_col
|
||||||
!= sub2->list.multi[i].start.col)
|
!= sub2->list.multi[i].start_col)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (nfa_has_backref) {
|
if (nfa_has_backref) {
|
||||||
if (i < sub1->in_use) {
|
if (i < sub1->in_use) {
|
||||||
s1 = sub1->list.multi[i].end.lnum;
|
s1 = sub1->list.multi[i].end_lnum;
|
||||||
} else {
|
} else {
|
||||||
s1 = -1;
|
s1 = -1;
|
||||||
}
|
}
|
||||||
if (i < sub2->in_use) {
|
if (i < sub2->in_use) {
|
||||||
s2 = sub2->list.multi[i].end.lnum;
|
s2 = sub2->list.multi[i].end_lnum;
|
||||||
} else {
|
} else {
|
||||||
s2 = -1;
|
s2 = -1;
|
||||||
}
|
}
|
||||||
@@ -3587,7 +3591,7 @@ static int sub_equal(regsub_T *sub1, regsub_T *sub2)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (s1 != -1
|
if (s1 != -1
|
||||||
&& sub1->list.multi[i].end.col != sub2->list.multi[i].end.col) {
|
&& sub1->list.multi[i].end_col != sub2->list.multi[i].end_col) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3637,7 +3641,7 @@ static void report_state(char *action,
|
|||||||
if (sub->in_use <= 0)
|
if (sub->in_use <= 0)
|
||||||
col = -1;
|
col = -1;
|
||||||
else if (REG_MULTI)
|
else if (REG_MULTI)
|
||||||
col = sub->list.multi[0].start.col;
|
col = sub->list.multi[0].start_col;
|
||||||
else
|
else
|
||||||
col = (int)(sub->list.line[0].start - regline);
|
col = (int)(sub->list.line[0].start - regline);
|
||||||
nfa_set_code(state->c);
|
nfa_set_code(state->c);
|
||||||
@@ -4023,22 +4027,24 @@ skip_add:
|
|||||||
* and restore it when it was in use. Otherwise fill any gap. */
|
* and restore it when it was in use. Otherwise fill any gap. */
|
||||||
if (REG_MULTI) {
|
if (REG_MULTI) {
|
||||||
if (subidx < sub->in_use) {
|
if (subidx < sub->in_use) {
|
||||||
save_lpos = sub->list.multi[subidx].start;
|
save_lpos.lnum = sub->list.multi[subidx].start_lnum;
|
||||||
|
save_lpos.col = sub->list.multi[subidx].start_col;
|
||||||
save_in_use = -1;
|
save_in_use = -1;
|
||||||
} else {
|
} else {
|
||||||
save_in_use = sub->in_use;
|
save_in_use = sub->in_use;
|
||||||
for (i = sub->in_use; i < subidx; ++i) {
|
for (i = sub->in_use; i < subidx; ++i) {
|
||||||
sub->list.multi[i].start.lnum = -1;
|
sub->list.multi[i].start_lnum = -1;
|
||||||
sub->list.multi[i].end.lnum = -1;
|
sub->list.multi[i].end_lnum = -1;
|
||||||
}
|
}
|
||||||
sub->in_use = subidx + 1;
|
sub->in_use = subidx + 1;
|
||||||
}
|
}
|
||||||
if (off == -1) {
|
if (off == -1) {
|
||||||
sub->list.multi[subidx].start.lnum = reglnum + 1;
|
sub->list.multi[subidx].start_lnum = reglnum + 1;
|
||||||
sub->list.multi[subidx].start.col = 0;
|
sub->list.multi[subidx].start_col = 0;
|
||||||
} else {
|
} else {
|
||||||
sub->list.multi[subidx].start.lnum = reglnum;
|
|
||||||
sub->list.multi[subidx].start.col =
|
sub->list.multi[subidx].start_lnum = reglnum;
|
||||||
|
sub->list.multi[subidx].start_col =
|
||||||
(colnr_T)(reginput - regline + off);
|
(colnr_T)(reginput - regline + off);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -4064,8 +4070,10 @@ skip_add:
|
|||||||
sub = &subs->norm;
|
sub = &subs->norm;
|
||||||
|
|
||||||
if (save_in_use == -1) {
|
if (save_in_use == -1) {
|
||||||
if (REG_MULTI)
|
if (REG_MULTI){
|
||||||
sub->list.multi[subidx].start = save_lpos;
|
sub->list.multi[subidx].start_lnum = save_lpos.lnum;
|
||||||
|
sub->list.multi[subidx].start_col = save_lpos.col;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
sub->list.line[subidx].start = save_ptr;
|
sub->list.line[subidx].start = save_ptr;
|
||||||
} else
|
} else
|
||||||
@@ -4074,7 +4082,7 @@ skip_add:
|
|||||||
|
|
||||||
case NFA_MCLOSE:
|
case NFA_MCLOSE:
|
||||||
if (nfa_has_zend && (REG_MULTI
|
if (nfa_has_zend && (REG_MULTI
|
||||||
? subs->norm.list.multi[0].end.lnum >= 0
|
? subs->norm.list.multi[0].end_lnum >= 0
|
||||||
: subs->norm.list.line[0].end != NULL)) {
|
: subs->norm.list.line[0].end != NULL)) {
|
||||||
/* Do not overwrite the position set by \ze. */
|
/* Do not overwrite the position set by \ze. */
|
||||||
subs = addstate(l, state->out, subs, pim, off);
|
subs = addstate(l, state->out, subs, pim, off);
|
||||||
@@ -4117,13 +4125,14 @@ skip_add:
|
|||||||
if (sub->in_use <= subidx)
|
if (sub->in_use <= subidx)
|
||||||
sub->in_use = subidx + 1;
|
sub->in_use = subidx + 1;
|
||||||
if (REG_MULTI) {
|
if (REG_MULTI) {
|
||||||
save_lpos = sub->list.multi[subidx].end;
|
save_lpos.lnum = sub->list.multi[subidx].end_lnum;
|
||||||
|
save_lpos.col = sub->list.multi[subidx].end_col;
|
||||||
if (off == -1) {
|
if (off == -1) {
|
||||||
sub->list.multi[subidx].end.lnum = reglnum + 1;
|
sub->list.multi[subidx].end_lnum = reglnum + 1;
|
||||||
sub->list.multi[subidx].end.col = 0;
|
sub->list.multi[subidx].end_col = 0;
|
||||||
} else {
|
} else {
|
||||||
sub->list.multi[subidx].end.lnum = reglnum;
|
sub->list.multi[subidx].end_lnum = reglnum;
|
||||||
sub->list.multi[subidx].end.col =
|
sub->list.multi[subidx].end_col =
|
||||||
(colnr_T)(reginput - regline + off);
|
(colnr_T)(reginput - regline + off);
|
||||||
}
|
}
|
||||||
/* avoid compiler warnings */
|
/* avoid compiler warnings */
|
||||||
@@ -4143,8 +4152,10 @@ skip_add:
|
|||||||
else
|
else
|
||||||
sub = &subs->norm;
|
sub = &subs->norm;
|
||||||
|
|
||||||
if (REG_MULTI)
|
if (REG_MULTI){
|
||||||
sub->list.multi[subidx].end = save_lpos;
|
sub->list.multi[subidx].end_lnum = save_lpos.lnum;
|
||||||
|
sub->list.multi[subidx].end_col = save_lpos.col;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
sub->list.line[subidx].end = save_ptr;
|
sub->list.line[subidx].end = save_ptr;
|
||||||
sub->in_use = save_in_use;
|
sub->in_use = save_in_use;
|
||||||
@@ -4319,24 +4330,24 @@ retempty:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (REG_MULTI) {
|
if (REG_MULTI) {
|
||||||
if (sub->list.multi[subidx].start.lnum < 0
|
if (sub->list.multi[subidx].start_lnum < 0
|
||||||
|| sub->list.multi[subidx].end.lnum < 0)
|
|| sub->list.multi[subidx].end_lnum < 0)
|
||||||
goto retempty;
|
goto retempty;
|
||||||
if (sub->list.multi[subidx].start.lnum == reglnum
|
if (sub->list.multi[subidx].start_lnum == reglnum
|
||||||
&& sub->list.multi[subidx].end.lnum == reglnum) {
|
&& sub->list.multi[subidx].end_lnum == reglnum) {
|
||||||
len = sub->list.multi[subidx].end.col
|
len = sub->list.multi[subidx].end_col
|
||||||
- sub->list.multi[subidx].start.col;
|
- sub->list.multi[subidx].start_col;
|
||||||
if (cstrncmp(regline + sub->list.multi[subidx].start.col,
|
if (cstrncmp(regline + sub->list.multi[subidx].start_col,
|
||||||
reginput, &len) == 0) {
|
reginput, &len) == 0) {
|
||||||
*bytelen = len;
|
*bytelen = len;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (match_with_backref(
|
if (match_with_backref(
|
||||||
sub->list.multi[subidx].start.lnum,
|
sub->list.multi[subidx].start_lnum,
|
||||||
sub->list.multi[subidx].start.col,
|
sub->list.multi[subidx].start_col,
|
||||||
sub->list.multi[subidx].end.lnum,
|
sub->list.multi[subidx].end_lnum,
|
||||||
sub->list.multi[subidx].end.col,
|
sub->list.multi[subidx].end_col,
|
||||||
bytelen) == RA_MATCH)
|
bytelen) == RA_MATCH)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -4873,8 +4884,8 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
|
|||||||
* it's the first MOPEN. */
|
* it's the first MOPEN. */
|
||||||
if (toplevel) {
|
if (toplevel) {
|
||||||
if (REG_MULTI) {
|
if (REG_MULTI) {
|
||||||
m->norm.list.multi[0].start.lnum = reglnum;
|
m->norm.list.multi[0].start_lnum = reglnum;
|
||||||
m->norm.list.multi[0].start.col = (colnr_T)(reginput - regline);
|
m->norm.list.multi[0].start_col = (colnr_T)(reginput - regline);
|
||||||
} else
|
} else
|
||||||
m->norm.list.line[0].start = reginput;
|
m->norm.list.line[0].start = reginput;
|
||||||
m->norm.in_use = 1;
|
m->norm.in_use = 1;
|
||||||
@@ -4962,7 +4973,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
|
|||||||
if (t->subs.norm.in_use <= 0)
|
if (t->subs.norm.in_use <= 0)
|
||||||
col = -1;
|
col = -1;
|
||||||
else if (REG_MULTI)
|
else if (REG_MULTI)
|
||||||
col = t->subs.norm.list.multi[0].start.col;
|
col = t->subs.norm.list.multi[0].start_col;
|
||||||
else
|
else
|
||||||
col = (int)(t->subs.norm.list.line[0].start - regline);
|
col = (int)(t->subs.norm.list.line[0].start - regline);
|
||||||
nfa_set_code(t->state->c);
|
nfa_set_code(t->state->c);
|
||||||
@@ -5214,7 +5225,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
|
|||||||
* continue with what follows. */
|
* continue with what follows. */
|
||||||
if (REG_MULTI)
|
if (REG_MULTI)
|
||||||
/* TODO: multi-line match */
|
/* TODO: multi-line match */
|
||||||
bytelen = m->norm.list.multi[0].end.col
|
bytelen = m->norm.list.multi[0].end_col
|
||||||
- (int)(reginput - regline);
|
- (int)(reginput - regline);
|
||||||
else
|
else
|
||||||
bytelen = (int)(m->norm.list.line[0].end - reginput);
|
bytelen = (int)(m->norm.list.line[0].end - reginput);
|
||||||
@@ -6018,7 +6029,7 @@ static int nfa_regmatch(nfa_regprog_T *prog, nfa_state_T *start, regsubs_T *subm
|
|||||||
|
|
||||||
if (add) {
|
if (add) {
|
||||||
if (REG_MULTI)
|
if (REG_MULTI)
|
||||||
m->norm.list.multi[0].start.col =
|
m->norm.list.multi[0].start_col =
|
||||||
(colnr_T)(reginput - regline) + clen;
|
(colnr_T)(reginput - regline) + clen;
|
||||||
else
|
else
|
||||||
m->norm.list.line[0].start = reginput + clen;
|
m->norm.list.line[0].start = reginput + clen;
|
||||||
@@ -6123,8 +6134,11 @@ static long nfa_regtry(nfa_regprog_T *prog, colnr_T col)
|
|||||||
cleanup_subexpr();
|
cleanup_subexpr();
|
||||||
if (REG_MULTI) {
|
if (REG_MULTI) {
|
||||||
for (i = 0; i < subs.norm.in_use; i++) {
|
for (i = 0; i < subs.norm.in_use; i++) {
|
||||||
reg_startpos[i] = subs.norm.list.multi[i].start;
|
reg_startpos[i].lnum = subs.norm.list.multi[i].start_lnum;
|
||||||
reg_endpos[i] = subs.norm.list.multi[i].end;
|
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) {
|
if (reg_startpos[0].lnum < 0) {
|
||||||
@@ -6162,12 +6176,12 @@ static long nfa_regtry(nfa_regprog_T *prog, colnr_T col)
|
|||||||
struct multipos *mpos = &subs.synt.list.multi[i];
|
struct multipos *mpos = &subs.synt.list.multi[i];
|
||||||
|
|
||||||
// Only accept single line matches that are valid.
|
// Only accept single line matches that are valid.
|
||||||
if (mpos->start.lnum >= 0
|
if (mpos->start_lnum >= 0
|
||||||
&& mpos->start.lnum == mpos->end.lnum
|
&& mpos->start_lnum == mpos->end_lnum
|
||||||
&& mpos->end.col >= mpos->start.col) {
|
&& mpos->end_col >= mpos->start_col) {
|
||||||
re_extmatch_out->matches[i] =
|
re_extmatch_out->matches[i] =
|
||||||
vim_strnsave(reg_getline(mpos->start.lnum) + mpos->start.col,
|
vim_strnsave(reg_getline(mpos->start_lnum) + mpos->start_col,
|
||||||
mpos->end.col - mpos->start.col);
|
mpos->end_col - mpos->start_col);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
struct linepos *lpos = &subs.synt.list.line[i];
|
struct linepos *lpos = &subs.synt.list.line[i];
|
||||||
|
@@ -261,7 +261,7 @@ static int included_patches[] = {
|
|||||||
//603,
|
//603,
|
||||||
//602,
|
//602,
|
||||||
601,
|
601,
|
||||||
//600,
|
600,
|
||||||
599,
|
599,
|
||||||
//598,
|
//598,
|
||||||
597,
|
597,
|
||||||
|
Reference in New Issue
Block a user