# HG changeset patch # User Bram Moolenaar # Date 1396726136 -7200 # Node ID 0b9a66ea49f435536745be0e0a6154be7b607249 # Parent ddc6a8829b861c61d63b8cd7524b0148f5f77485 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) diff --git a/src/eval.c b/src/eval.c --- 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; diff --git a/src/testdir/test_eval.in b/src/testdir/test_eval.in --- 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 :" diff --git a/src/testdir/test_eval.ok b/src/testdir/test_eval.ok index 7fe5f1bd1b2745600d74f4bb8a86e7fa1391f607..061e0cfd2f37ba12d5e66b1fe51221385b899374 GIT binary patch literal 10578 zc%02zO>f&c5an4wuQ?OGxB*hwmYi*yg%7qRCjp9Hy67dyL2{JDfMN%>(ryv#e_wvh zkd%gslk9Fbhe#UEyf>s~hC|zrkB=i>l{K%+UA>EXC%pc3U-BQn^B;NjP@eF-Sn~H5 zeR1hu9v<=X&--mdh(_OCBSu=Wr_A1g#yj88lSh;N-0X?Ro)oJaY4|9oJIi;gCEu0x zw!AU(7V_9g-uLtV5tm3)d0qAoqnx6f8osITs4I>plV~FECq6-82xjv7Ll6`c!OS4d zd;(Vt1hWRg(h$t$wGsqNYOUw6rgNXclS>MDE3Y2MmElO`^}FD>qBv5(N_`GbZaC5w zM`<`Rc`XD-X*dqXE=gvvGM~d0!%AfhhHJyHkki3xkOQX_(LZ}V=B1tM>xm1D>x4J1@?t|ktxzh9qv@PLASk-q(NrNjA z@3SNdf@yt%(PD+%+|QQqJJN%}MOE$>$3uTzhuu@qmR-&m>?fx43>;!=e2>3L#9bhN z73Q!VW38Ce`?1ooyDwTbw&$=K?$%1sst%}&^>R+d5-=#uHVtBsZar-TOAKBrdBf8b zx{Cs~{*+9{lqn@_CeW(UZ3MNznbf?(wD29tpanrkGSZQZDJ5(<(8_N~!dlp&7)P>@ zBN#*(6-0(X{l^&bC!s+ozxJ^*A(lnjM;>1H~rS%BBlf(H4FyzY8(jVX?kmk%T>(?7)aZjM zx}7#i8Y2*+?Fq@#>c!}Y$GSj?r{vNeSuNX$#j>I?jXRR@5%z3zTlveKMY>HlCLl(DXSaVOq_GuQ^#H%`;rLrVaT>%fgXg z>Cn$RVqfbyfo>Yfq-rHYr>e~kEh0NM6XAt+t8fbZ!Eb(=Fs*2l!gO6p(af7pO`Axj z7ZKui`8O${c0hUqP%J{j$sf~sC2=dqI#q4bX%TtuHLqRi(>pqZh`!ie+zl1DYwr2a zwS}$#;!R)Z9>Ii$%>}wuz+lqaR7k;H^E~`aQ*1IYF!fM4IxE~S=YYTl#5}DZ5BV-d}qOHI!C?#{t2B=o2!W8bBhmU8P;)w*ZPsY2x79ExL=~nkb z_cSUFs~F$ceyPHkv3nx$p>sl(&Lny{YAC%}WOM?F#%!F&&r3J$thDRS9>-Tr(v^rW z2MwjDUID2@CM&Z!6JyNde)6$1XPJ49yA#myRkL&^^NT^9UCP;}xXE?SKonC+&uq#a z5A`}654}$rhF$5ey;jEE>Fl^|sJcqSYhazS@tnVQi7_juaD(TRuV3~&u#7(pz3d%- zh}AvQ4~dnJjYw$7>EvWt5^$zyNFcaNSPKFR%1a$^%hrF#3S~{$n^Gn%BQT3vHmx#e z8`<&FcR~uR7xF1_M#dmij+nwof7C32P2p0Ic$+W+3<}$8-0@228_;91l_;jdD*FhH zBf>Ix;vHAMGg4rkkxz*;G6o^Mn($Y;64;bf1&Ox_BfzkedW}C`b$<(fX!j(DemB}Y zLfeQiB)`zsHFsS2-bjJ%l)6a7M=g>t8yBOY@0}J||MYX>jgIXAzBToIIsU-F|GwPN z==A~u=OJMMX!z9epK;UsO!I%@5`J%?@$j_*n0~Pa${F#2pwY;;%UhnWuhcxt-EOs6 zH-4QnfLA||;Pqe7h|cT}rn2pJv)x76pXKsFHG<2$s%+=?eRcOtdAKXrqHDa~Z29%WdRdD%dSYw?h@*c2Qhx$^#K#TnPbd73&4%CQ z>t8QJz7Vw|_CP--!xR1>f5O7Qh=!TxJD&4z^;QVN-aY=+z!(8Wx>9cB+h6-3iFsaJ zzS5!IpeImzBk{i%_k6TZpAxwwDpBwAx-PftM#6FdA$ZEISk_;BEneMnv##^in%6%! eTrBO~W@~=j6XKt|E&oWeOLFPPrM&LHqJIN$wnXay diff --git a/src/version.c b/src/version.c --- 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,