0
0
mirror of https://github.com/vim/vim.git synced 2025-10-02 05:04:20 -04:00

patch 7.4.2160

Problem:    setmatches() mixes up values. (Nikolai Pavlov)
Solution:   Save the string instead of reusing a shared buffer.
This commit is contained in:
Bram Moolenaar
2016-08-05 22:22:06 +02:00
parent 5971dab112
commit 7dc5e2e486
4 changed files with 16 additions and 2 deletions

View File

@@ -418,6 +418,7 @@ dict_find(dict_T *d, char_u *key, int len)
/* /*
* Get a string item from a dictionary. * Get a string item from a dictionary.
* When "save" is TRUE allocate memory for it. * When "save" is TRUE allocate memory for it.
* When FALSE a shared buffer is used, can only be used once!
* Returns NULL if the entry doesn't exist or out of memory. * Returns NULL if the entry doesn't exist or out of memory.
*/ */
char_u * char_u *

View File

@@ -9659,11 +9659,11 @@ f_setmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
} }
} }
group = get_dict_string(d, (char_u *)"group", FALSE); group = get_dict_string(d, (char_u *)"group", TRUE);
priority = (int)get_dict_number(d, (char_u *)"priority"); priority = (int)get_dict_number(d, (char_u *)"priority");
id = (int)get_dict_number(d, (char_u *)"id"); id = (int)get_dict_number(d, (char_u *)"id");
conceal = dict_find(d, (char_u *)"conceal", -1) != NULL conceal = dict_find(d, (char_u *)"conceal", -1) != NULL
? get_dict_string(d, (char_u *)"conceal", FALSE) ? get_dict_string(d, (char_u *)"conceal", TRUE)
: NULL; : NULL;
if (i == 0) if (i == 0)
{ {
@@ -9677,6 +9677,8 @@ f_setmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
list_unref(s); list_unref(s);
s = NULL; s = NULL;
} }
vim_free(group);
vim_free(conceal);
li = li->li_next; li = li->li_next;
} }

View File

@@ -194,3 +194,12 @@ func Test_funcref()
let OneByRef = funcref('One') let OneByRef = funcref('One')
call assert_equal(2, OneByRef()) call assert_equal(2, OneByRef())
endfunc endfunc
func Test_setmatches()
hi def link 1 Comment
hi def link 2 PreProc
let set = [{"group": 1, "pattern": 2, "id": 3, "priority": 4, "conceal": 5}]
let exp = [{"group": '1', "pattern": '2', "id": 3, "priority": 4, "conceal": '5'}]
call setmatches(set)
call assert_equal(exp, getmatches())
endfunc

View File

@@ -763,6 +763,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
2160,
/**/ /**/
2159, 2159,
/**/ /**/