diff options
author | Shougo <Shougo.Matsu@gmail.com> | 2017-01-15 10:38:57 +0900 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2017-01-15 02:38:57 +0100 |
commit | a6be6df5d6212ab9588afebde127ae4406e478d7 (patch) | |
tree | 55c4730c8ac60c801b76b0d83e2471ed197fcd30 /src | |
parent | c88e4a270d54eae3fe8e6b93a0ed3898e4632be5 (diff) | |
download | rneovim-a6be6df5d6212ab9588afebde127ae4406e478d7.tar.gz rneovim-a6be6df5d6212ab9588afebde127ae4406e478d7.tar.bz2 rneovim-a6be6df5d6212ab9588afebde127ae4406e478d7.zip |
vim-patch:7.4.2160 (#5952)
Problem: setmatches() mixes up values. (Nikolai Pavlov)
Solution: Save the string instead of reusing a shared buffer.
https://github.com/vim/vim/commit/7dc5e2e486fe0287601968e535902a41a39f65bb
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 8 | ||||
-rw-r--r-- | src/nvim/testdir/test_expr.vim | 8 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
3 files changed, 14 insertions, 4 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 6688405860..7a7ba9bb55 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -6726,6 +6726,7 @@ static bool get_dict_callback(dict_T *d, char *key, Callback *result) /// Get a string item from a dictionary. /// /// @param save whether memory should be allocated for the return value +/// when false a shared buffer is used, can only be used once! /// /// @return the entry or NULL if the entry doesn't exist. char_u *get_dict_string(dict_T *d, char *key, bool save) @@ -15445,12 +15446,11 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr) } } - char_u *group = get_dict_string(d, "group", false); + char_u *group = get_dict_string(d, "group", true); int priority = get_dict_number(d, "priority"); int id = get_dict_number(d, "id"); char_u *conceal = dict_find(d, (char_u *)"conceal", -1) != NULL - ? get_dict_string(d, "conceal", - false) + ? get_dict_string(d, "conceal", true) : NULL; if (i == 0) { match_add(curwin, group, @@ -15461,6 +15461,8 @@ static void f_setmatches(typval_T *argvars, typval_T *rettv, FunPtr fptr) list_unref(s); s = NULL; } + xfree(group); + xfree(conceal); li = li->li_next; } rettv->vval.v_number = 0; diff --git a/src/nvim/testdir/test_expr.vim b/src/nvim/testdir/test_expr.vim index 189ecce2fe..217cf6fb96 100644 --- a/src/nvim/testdir/test_expr.vim +++ b/src/nvim/testdir/test_expr.vim @@ -96,4 +96,12 @@ endfunc func Test_special_char() " The failure is only visible using valgrind. call assert_fails('echo "\<C-">') + +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 diff --git a/src/nvim/version.c b/src/nvim/version.c index 70abbcef76..0fb274dc07 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -280,7 +280,7 @@ static int included_patches[] = { 2163, 2162, // 2161, - // 2160, + 2160, // 2159, 2158, // 2157 NA |