Bram Moolenaar
unread,Feb 10, 2021, 4:24:20 PM2/10/21Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to vim...@googlegroups.com
Patch 8.2.2497
Problem: No error when using more than one character for a register name.
Solution: In Vim9 script check for a single character string. (closes #7814)
Fix that VAR_BOOL and VAR_SPECIAL are not considered equal.
Files: src/errors.h, src/evalfunc.c, src/typval.c,
src/testdir/test_vim9_builtin.vim
*** ../vim-8.2.2496/src/errors.h 2021-02-08 21:53:05.592963320 +0100
--- src/errors.h 2021-02-10 21:56:21.096641926 +0100
***************
*** 359,361 ****
--- 359,363 ----
INIT(= N_("E1160: Cannot use a default for variable arguments"));
EXTERN char e_cannot_json_encode_str[]
INIT(= N_("E1161: Cannot json encode a %s"));
+ EXTERN char e_register_name_must_be_one_char_str[]
+ INIT(= N_("E1162: Register name must be one character: %s"));
*** ../vim-8.2.2496/src/evalfunc.c 2021-02-06 12:38:47.623324174 +0100
--- src/evalfunc.c 2021-02-10 22:10:31.822776214 +0100
***************
*** 4285,4291 ****
if (argvars[0].v_type != VAR_UNKNOWN)
{
strregname = tv_get_string_chk(&argvars[0]);
! error = strregname == NULL;
if (argvars[1].v_type != VAR_UNKNOWN)
{
arg2 = (int)tv_get_bool_chk(&argvars[1], &error);
--- 4285,4297 ----
if (argvars[0].v_type != VAR_UNKNOWN)
{
strregname = tv_get_string_chk(&argvars[0]);
! if (strregname == NULL)
! error = TRUE;
! else if (in_vim9script() && STRLEN(strregname) > 1)
! {
! semsg(_(e_register_name_must_be_one_char_str), strregname);
! error = TRUE;
! }
if (argvars[1].v_type != VAR_UNKNOWN)
{
arg2 = (int)tv_get_bool_chk(&argvars[1], &error);
***************
*** 4335,4340 ****
--- 4341,4351 ----
if (argvars[0].v_type != VAR_UNKNOWN)
{
strregname = tv_get_string_chk(&argvars[0]);
+ if (strregname != NULL && in_vim9script() && STRLEN(strregname) > 1)
+ {
+ semsg(_(e_register_name_must_be_one_char_str), strregname);
+ strregname = NULL;
+ }
if (strregname == NULL) // type error; errmsg already given
{
rettv->v_type = VAR_STRING;
***************
*** 7368,7373 ****
--- 7379,7389 ----
strregname = tv_get_string_chk(&argvars[0]);
if (strregname == NULL)
return;
+ if (in_vim9script() && STRLEN(strregname) > 1)
+ {
+ semsg(_(e_register_name_must_be_one_char_str), strregname);
+ return;
+ }
}
else
strregname = get_vim_var_str(VV_REG);
***************
*** 7410,7416 ****
{
item->di_tv.v_type = VAR_SPECIAL;
item->di_tv.vval.v_number = regname == buf[0]
! ? VVAL_TRUE : VVAL_FALSE;
(void)dict_add(dict, item);
}
}
--- 7426,7432 ----
{
item->di_tv.v_type = VAR_SPECIAL;
item->di_tv.vval.v_number = regname == buf[0]
! ? VVAL_TRUE : VVAL_FALSE;
(void)dict_add(dict, item);
}
}
***************
*** 8472,8477 ****
--- 8488,8498 ----
if (strregname == NULL)
return; // type error; errmsg already given
+ if (in_vim9script() && STRLEN(strregname) > 1)
+ {
+ semsg(_(e_register_name_must_be_one_char_str), strregname);
+ return;
+ }
regname = *strregname;
if (regname == 0 || regname == '@')
regname = '"';
*** ../vim-8.2.2496/src/typval.c 2021-01-31 13:08:16.164367438 +0100
--- src/typval.c 2021-02-10 22:17:49.756864145 +0100
***************
*** 1069,1075 ****
return r;
}
! if (tv1->v_type != tv2->v_type)
return FALSE;
switch (tv1->v_type)
--- 1069,1077 ----
return r;
}
! if (tv1->v_type != tv2->v_type
! && ((tv1->v_type != VAR_BOOL && tv1->v_type != VAR_SPECIAL)
! || (tv2->v_type != VAR_BOOL && tv2->v_type != VAR_SPECIAL)))
return FALSE;
switch (tv1->v_type)
*** ../vim-8.2.2496/src/testdir/test_vim9_builtin.vim 2021-02-07 14:31:02.963000750 +0100
--- src/testdir/test_vim9_builtin.vim 2021-02-10 22:11:25.770657848 +0100
***************
*** 531,536 ****
--- 531,537 ----
var lines = ['aaa', 'bbb', 'ccc']
setreg('a', lines)
getreg('a', true, true)->assert_equal(lines)
+ assert_fails('getreg("ab")', 'E1162:')
enddef
def Test_getreg_return_type()
***************
*** 539,544 ****
--- 540,559 ----
var s3: list<string> = getreg('"', 1, 1)
enddef
+ def Test_getreginfo()
+ var text = 'abc'
+ setreg('a', text)
+ getreginfo('a')->assert_equal({regcontents: [text], regtype: 'v', isunnamed: false})
+ assert_fails('getreginfo("ab")', 'E1162:')
+ enddef
+
+ def Test_getregtype()
+ var lines = ['aaa', 'bbb', 'ccc']
+ setreg('a', lines)
+ getregtype('a')->assert_equal('V')
+ assert_fails('getregtype("ab")', 'E1162:')
+ enddef
+
def Test_glob()
glob('runtest.vim', true, true, true)->assert_equal(['runtest.vim'])
enddef
***************
*** 878,883 ****
--- 893,899 ----
var reginfo = getreginfo('a')
setreg('a', reginfo)
getreginfo('a')->assert_equal(reginfo)
+ assert_fails('setreg("ab", 0)', 'E1162:')
enddef
def Test_slice()
*** ../vim-8.2.2496/src/version.c 2021-02-10 21:20:21.969294832 +0100
--- src/version.c 2021-02-10 21:57:56.012433870 +0100
***************
*** 752,753 ****
--- 752,755 ----
{ /* Add new patch number below this line */
+ /**/
+ 2497,
/**/