]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.249 v7.4.249
authorBram Moolenaar <Bram@vim.org>
Sat, 5 Apr 2014 19:28:56 +0000 (21:28 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 5 Apr 2014 19:28:56 +0000 (21:28 +0200)
Problem:    Using setreg() with a list of numbers does not work.
Solution:   Use a separate buffer for numbers. (ZyX)

src/eval.c
src/testdir/test_eval.in
src/testdir/test_eval.ok
src/version.c

index be8d4da3e90ad4c698b08e986182111cd45e3e92..2014deb801ae85bc6b4eaa9f6631921ce956b793 100644 (file)
@@ -16827,24 +16827,36 @@ f_setreg(argvars, rettv)
     if (argvars[1].v_type == VAR_LIST)
     {
        char_u          **lstval;
+       char_u          **allocval;
+       char_u          buf[NUMBUFLEN];
        char_u          **curval;
+       char_u          **curallocval;
        int             len = argvars[1].vval.v_list->lv_len;
        listitem_T      *li;
 
-       lstval = (char_u **)alloc(sizeof(char_u *) * (len + 1));
+       /* First half: use for pointers to result lines; second half: use for
+        * pointers to allocated copies. */
+       lstval = (char_u **)alloc(sizeof(char_u *) * ((len + 1) * 2));
        if (lstval == NULL)
            return;
        curval = lstval;
+       allocval = lstval + len + 2;
+       curallocval = allocval;
 
        for (li = argvars[1].vval.v_list->lv_first; li != NULL;
                                                             li = li->li_next)
        {
-           /* TODO: this may use a static buffer several times. */
-           strval = get_tv_string_chk(&li->li_tv);
+           strval = get_tv_string_buf_chk(&li->li_tv, buf);
            if (strval == NULL)
+               goto free_lstval;
+           if (strval == buf)
            {
-               vim_free(lstval);
-               return;
+               /* Need to make a copy, next get_tv_string_buf_chk() will
+                * overwrite the string. */
+               strval = vim_strsave(buf);
+               if (strval == NULL)
+                   goto free_lstval;
+               *curallocval++ = strval;
            }
            *curval++ = strval;
        }
@@ -16852,6 +16864,9 @@ f_setreg(argvars, rettv)
 
        write_reg_contents_lst(regname, lstval, -1,
                                                append, yank_type, block_len);
+free_lstval:
+       while (curallocval > allocval)
+           vim_free(*--curallocval);
        vim_free(lstval);
     }
     else
@@ -20453,6 +20468,9 @@ get_tv_string_buf(varp, buf)
     return res != NULL ? res : (char_u *)"";
 }
 
+/*
+ * Careful: This uses a single, static buffer.  YOU CAN ONLY USE IT ONCE!
+ */
     char_u *
 get_tv_string_chk(varp)
     typval_T   *varp;
index 0a7ede695f01e845cdae2d0e321674eb213f3568..b102be2b1079819a82722869e8b6d99636dca72e 100644 (file)
@@ -90,6 +90,8 @@ call SetReg('a', ['abcA3'], 'c')
 call SetReg('b', ['abcB3'], 'l')
 call SetReg('c', ['abcC3'], 'b')
 call SetReg('d', ['abcD3'])
+call SetReg('e', [1, 2, 'abc', 3])
+call SetReg('f', [1, 2, 3])
 
 $put ='{{{1 Appending lists with setreg()'
 call SetReg('A', ['abcA3c'], 'c')
@@ -128,8 +130,8 @@ call ErrExe('call setreg(1, 2, 3, 4)')
 call ErrExe('call setreg([], 2)')
 call ErrExe('call setreg(1, {})')
 call ErrExe('call setreg(1, 2, [])')
-call ErrExe('call setreg("/", [1, 2])')
-call ErrExe('call setreg("=", [1, 2])')
+call ErrExe('call setreg("/", ["1", "2"])')
+call ErrExe('call setreg("=", ["1", "2"])')
 call ErrExe('call setreg(1, ["", "", [], ""])')
 endfun
 :"
index 7fe5f1bd1b2745600d74f4bb8a86e7fa1391f607..061e0cfd2f37ba12d5e66b1fe51221385b899374 100644 (file)
Binary files a/src/testdir/test_eval.ok and b/src/testdir/test_eval.ok differ
index eaa74cd17c2b6e25e9aa33408f2fb2dcd70a73d2..c0021073058c7d705503df5e6114c2a600249d30 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    249,
 /**/
     248,
 /**/