Patch 7.4.2160
Problem:    setmatches() mixes up values. (Nikolai Pavlov)
Solution:   Save the string instead of reusing a shared buffer.
Files:      src/dict.c, src/evalfunc.c, src/testdir/test_expr.vim


*** ../vim-7.4.2159/src/dict.c  2016-07-17 15:46:08.464046515 +0200
--- src/dict.c  2016-08-05 21:36:31.453078198 +0200
***************
*** 418,423 ****
--- 418,424 ----
  /*
   * 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 *
*** ../vim-7.4.2159/src/evalfunc.c      2016-08-05 20:35:09.786315271 +0200
--- src/evalfunc.c      2016-08-05 21:39:04.755860033 +0200
***************
*** 9659,9669 ****
                }
            }
  
!           group = get_dict_string(d, (char_u *)"group", FALSE);
            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)
                              : NULL;
            if (i == 0)
            {
--- 9659,9669 ----
                }
            }
  
!           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", TRUE)
                              : NULL;
            if (i == 0)
            {
***************
*** 9677,9682 ****
--- 9677,9684 ----
                list_unref(s);
                s = NULL;
            }
+           vim_free(group);
+           vim_free(conceal);
  
            li = li->li_next;
        }
*** ../vim-7.4.2159/src/testdir/test_expr.vim   2016-08-01 15:40:24.187878367 
+0200
--- src/testdir/test_expr.vim   2016-08-05 21:43:13.637884751 +0200
***************
*** 194,196 ****
--- 194,205 ----
    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
*** ../vim-7.4.2159/src/version.c       2016-08-05 21:25:26.054376197 +0200
--- src/version.c       2016-08-05 21:37:39.760535161 +0200
***************
*** 765,766 ****
--- 765,768 ----
  {   /* Add new patch number below this line */
+ /**/
+     2160,
  /**/

-- 
Hanson's Treatment of Time:
        There are never enough hours in a day, but always too
        many days before Saturday.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui