changeset 5810:0b9a66ea49f4 v7.4.249

updated for version 7.4.249 Problem: Using setreg() with a list of numbers does not work. Solution: Use a separate buffer for numbers. (ZyX)
author Bram Moolenaar <bram@vim.org>
date Sat, 05 Apr 2014 21:28:56 +0200
parents ddc6a8829b86
children ea4678cc1e16
files src/eval.c src/testdir/test_eval.in src/testdir/test_eval.ok src/version.c
diffstat 4 files changed, 30 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -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)
-	    {
-		vim_free(lstval);
-		return;
+		goto free_lstval;
+	    if (strval == buf)
+	    {
+		/* 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;
--- a/src/testdir/test_eval.in
+++ b/src/testdir/test_eval.in
@@ -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
GIT binary patch
literal 10578
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
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    249,
+/**/
     248,
 /**/
     247,