Mercurial > vim
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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