Skip to content

Commit 455d62e

Browse files
John Marriottchrisbra
authored andcommitted
patch 9.2.0068: Inefficient use of list_append_string()
Problem: Inefficient use of list_append_string() Solution: Pass string length to list_append_string() where it is known (John Marriott). closes: #19491 Signed-off-by: John Marriott <[email protected]> Signed-off-by: Christian Brabandt <[email protected]>
1 parent 8ba1276 commit 455d62e

File tree

8 files changed

+186
-112
lines changed

8 files changed

+186
-112
lines changed

src/clipboard.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3838,7 +3838,8 @@ clip_provider_copy(char_u *reg, char_u *provider)
38383838
}
38393839

38403840
for (int i = 0; i < y_ptr->y_size; i++)
3841-
if (list_append_string(list, y_ptr->y_array[i].string, -1) == FAIL)
3841+
if (list_append_string(list, y_ptr->y_array[i].string,
3842+
(int)y_ptr->y_array[i].length) == FAIL)
38423843
{
38433844
free_callback(&callback);
38443845
list_unref(list);

src/evalbuffer.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -785,8 +785,6 @@ get_buffer_lines(
785785
int retlist,
786786
typval_T *rettv)
787787
{
788-
char_u *p;
789-
790788
if (retlist)
791789
{
792790
if (rettv_list_alloc(rettv) == FAIL)
@@ -804,10 +802,11 @@ get_buffer_lines(
804802
if (!retlist)
805803
{
806804
if (start >= 1 && start <= buf->b_ml.ml_line_count)
807-
p = ml_get_buf(buf, start, FALSE);
805+
rettv->vval.v_string =
806+
vim_strnsave(ml_get_buf(buf, start, FALSE),
807+
ml_get_buf_len(buf, start));
808808
else
809-
p = (char_u *)"";
810-
rettv->vval.v_string = vim_strsave(p);
809+
rettv->vval.v_string = vim_strnsave((char_u *)"", 0);
811810
}
812811
else
813812
{
@@ -819,9 +818,13 @@ get_buffer_lines(
819818
if (end > buf->b_ml.ml_line_count)
820819
end = buf->b_ml.ml_line_count;
821820
while (start <= end)
821+
{
822822
if (list_append_string(rettv->vval.v_list,
823-
ml_get_buf(buf, start++, FALSE), -1) == FAIL)
823+
ml_get_buf(buf, start, FALSE),
824+
(int)ml_get_buf_len(buf, start)) == FAIL)
824825
break;
826+
++start;
827+
}
825828
}
826829
}
827830

src/evalfunc.c

Lines changed: 68 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -6023,24 +6023,25 @@ f_getpos(typval_T *argvars, typval_T *rettv)
60236023
/*
60246024
* Convert from block_def to string
60256025
*/
6026-
static char_u *
6027-
block_def2str(struct block_def *bd)
6026+
static int
6027+
block_def2str(struct block_def *bd, string_T *ret)
60286028
{
6029-
char_u *p, *ret;
6030-
size_t size = bd->startspaces + bd->endspaces + bd->textlen;
6031-
6032-
ret = alloc(size + 1);
6033-
if (ret != NULL)
6029+
ret->string = alloc(bd->startspaces + bd->endspaces + bd->textlen + 1);
6030+
if (ret->string == NULL)
60346031
{
6035-
p = ret;
6036-
vim_memset(p, ' ', bd->startspaces);
6037-
p += bd->startspaces;
6038-
mch_memmove(p, bd->textstart, bd->textlen);
6039-
p += bd->textlen;
6040-
vim_memset(p, ' ', bd->endspaces);
6041-
*(p + bd->endspaces) = NUL;
6032+
ret->length = 0;
6033+
return FAIL;
60426034
}
6043-
return ret;
6035+
6036+
vim_memset(ret->string, ' ', bd->startspaces);
6037+
ret->length = bd->startspaces;
6038+
mch_memmove(ret->string + ret->length, bd->textstart, bd->textlen);
6039+
ret->length += bd->textlen;
6040+
vim_memset(ret->string + ret->length, ' ', bd->endspaces);
6041+
ret->length += bd->endspaces;
6042+
ret->string[ret->length] = NUL;
6043+
6044+
return OK;
60446045
}
60456046

60466047
static int
@@ -6221,7 +6222,7 @@ f_getregion(typval_T *argvars, typval_T *rettv)
62216222

62226223
buf_T *save_curbuf;
62236224
int save_virtual;
6224-
char_u *akt = NULL;
6225+
string_T akt = {NULL, 0};
62256226
linenr_T lnum;
62266227

62276228
save_curbuf = curbuf;
@@ -6233,31 +6234,47 @@ f_getregion(typval_T *argvars, typval_T *rettv)
62336234

62346235
for (lnum = p1.lnum; lnum <= p2.lnum; lnum++)
62356236
{
6236-
int ret = 0;
6237-
struct block_def bd;
6237+
int ret = OK;
62386238

6239-
if (region_type == MLINE)
6240-
akt = vim_strsave(ml_get(lnum));
6241-
else if (region_type == MBLOCK)
6239+
if (region_type == MBLOCK)
62426240
{
6241+
struct block_def bd;
6242+
62436243
block_prep(&oa, &bd, lnum, FALSE);
6244-
akt = block_def2str(&bd);
6244+
block_def2str(&bd, &akt);
6245+
}
6246+
else if (region_type == MLINE
6247+
|| (p1.lnum < lnum && lnum < p2.lnum))
6248+
{
6249+
string_T s;
6250+
6251+
s.string = ml_get(lnum);
6252+
s.length = ml_get_len(lnum);
6253+
akt.string = vim_strnsave(s.string, s.length);
6254+
if (akt.string == NULL)
6255+
akt.length = 0;
6256+
else
6257+
akt.length = s.length;
62456258
}
6246-
else if (p1.lnum < lnum && lnum < p2.lnum)
6247-
akt = vim_strsave(ml_get(lnum));
62486259
else
62496260
{
6261+
struct block_def bd;
6262+
62506263
charwise_block_prep(p1, p2, &bd, lnum, inclusive);
6251-
akt = block_def2str(&bd);
6264+
block_def2str(&bd, &akt);
62526265
}
62536266

6254-
if (akt)
6267+
if (akt.string == NULL)
62556268
{
6256-
ret = list_append_string(rettv->vval.v_list, akt, -1);
6257-
vim_free(akt);
6269+
clear_tv(rettv);
6270+
(void)rettv_list_alloc(rettv);
6271+
break;
62586272
}
62596273

6260-
if (akt == NULL || ret == FAIL)
6274+
ret = list_append_string(rettv->vval.v_list, akt.string, (int)akt.length);
6275+
vim_free(akt.string);
6276+
6277+
if (ret == FAIL)
62616278
{
62626279
clear_tv(rettv);
62636280
(void)rettv_list_alloc(rettv);
@@ -11954,12 +11971,28 @@ f_spellbadword(typval_T *argvars UNUSED, typval_T *rettv)
1195411971
#endif
1195511972

1195611973
list_append_string(rettv->vval.v_list, word, len);
11957-
list_append_string(rettv->vval.v_list, (char_u *)(
11958-
attr == HLF_SPB ? "bad" :
11959-
attr == HLF_SPR ? "rare" :
11960-
attr == HLF_SPL ? "local" :
11961-
attr == HLF_SPC ? "caps" :
11962-
""), -1);
11974+
switch (attr)
11975+
{
11976+
case HLF_SPB:
11977+
list_append_string(rettv->vval.v_list, (char_u *)"bad", STRLEN_LITERAL("bad"));
11978+
break;
11979+
11980+
case HLF_SPR:
11981+
list_append_string(rettv->vval.v_list, (char_u *)"rare", STRLEN_LITERAL("rare"));
11982+
break;
11983+
11984+
case HLF_SPL:
11985+
list_append_string(rettv->vval.v_list, (char_u *)"local", STRLEN_LITERAL("local"));
11986+
break;
11987+
11988+
case HLF_SPC:
11989+
list_append_string(rettv->vval.v_list, (char_u *)"caps", STRLEN_LITERAL("caps"));
11990+
break;
11991+
11992+
default:
11993+
list_append_string(rettv->vval.v_list, (char_u *)"", 0);
11994+
break;
11995+
}
1196311996
}
1196411997

1196511998
/*

src/evalwindow.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -293,14 +293,16 @@ get_framelayout(frame_T *fr, list_T *l, int outer)
293293
{
294294
if (fr->fr_win != NULL)
295295
{
296-
list_append_string(fr_list, (char_u *)"leaf", -1);
296+
list_append_string(fr_list, (char_u *)"leaf", STRLEN_LITERAL("leaf"));
297297
list_append_number(fr_list, fr->fr_win->w_id);
298298
}
299299
}
300300
else
301301
{
302-
list_append_string(fr_list,
303-
fr->fr_layout == FR_ROW ? (char_u *)"row" : (char_u *)"col", -1);
302+
if (fr->fr_layout == FR_ROW)
303+
list_append_string(fr_list, (char_u *)"row", STRLEN_LITERAL("row"));
304+
else
305+
list_append_string(fr_list, (char_u *)"col", STRLEN_LITERAL("col"));
304306

305307
win_list = list_alloc();
306308
if (win_list == NULL)

src/register.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,7 +1097,7 @@ yank_do_autocmd(oparg_T *oap, yankreg_T *reg)
10971097

10981098
// yanked text contents
10991099
for (n = 0; n < reg->y_size; n++)
1100-
list_append_string(list, reg->y_array[n].string, -1);
1100+
list_append_string(list, reg->y_array[n].string, (int)reg->y_array[n].length);
11011101
list->lv_lock = VAR_FIXED;
11021102
(void)dict_add_list(v_event, "regcontents", list);
11031103

@@ -2793,17 +2793,17 @@ get_reg_contents(int regname, int flags)
27932793
if (flags & GREG_LIST)
27942794
{
27952795
list_T *list = list_alloc();
2796-
int error = FALSE;
27972796

27982797
if (list == NULL)
27992798
return NULL;
28002799
for (i = 0; i < y_current->y_size; ++i)
2801-
if (list_append_string(list, y_current->y_array[i].string, -1) == FAIL)
2802-
error = TRUE;
2803-
if (error)
28042800
{
2805-
list_free(list);
2806-
return NULL;
2801+
if (list_append_string(list, y_current->y_array[i].string,
2802+
(int)y_current->y_array[i].length) == FAIL)
2803+
{
2804+
list_free(list);
2805+
return NULL;
2806+
}
28072807
}
28082808
return (char_u *)list;
28092809
}

0 commit comments

Comments
 (0)