changeset 9770:ba98d7ce0d74 v7.4.2160

commit https://github.com/vim/vim/commit/7dc5e2e486fe0287601968e535902a41a39f65bb Author: Bram Moolenaar <Bram@vim.org> Date: Fri Aug 5 22:22:06 2016 +0200 patch 7.4.2160 Problem: setmatches() mixes up values. (Nikolai Pavlov) Solution: Save the string instead of reusing a shared buffer.
author Christian Brabandt <cb@256bit.org>
date Fri, 05 Aug 2016 22:30:07 +0200
parents c1c78c065e99
children a8138a3ee54d
files src/dict.c src/evalfunc.c src/testdir/test_expr.vim src/version.c
diffstat 4 files changed, 16 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/dict.c
+++ b/src/dict.c
@@ -418,6 +418,7 @@ dict_find(dict_T *d, char_u *key, int le
 /*
  * Get a string item from a dictionary.
  * 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.
  */
     char_u *
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -9659,11 +9659,11 @@ f_setmatches(typval_T *argvars UNUSED, t
 		}
 	    }
 
-	    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");
 	    id = (int)get_dict_number(d, (char_u *)"id");
 	    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;
 	    if (i == 0)
 	    {
@@ -9677,6 +9677,8 @@ f_setmatches(typval_T *argvars UNUSED, t
 		list_unref(s);
 		s = NULL;
 	    }
+	    vim_free(group);
+	    vim_free(conceal);
 
 	    li = li->li_next;
 	}
--- a/src/testdir/test_expr.vim
+++ b/src/testdir/test_expr.vim
@@ -194,3 +194,12 @@ func Test_funcref()
   let OneByRef = funcref('One')
   call assert_equal(2, OneByRef())
 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
--- a/src/version.c
+++ b/src/version.c
@@ -764,6 +764,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2160,
+/**/
     2159,
 /**/
     2158,