]> granicus.if.org Git - vim/commitdiff
patch 8.2.2497: no error when using more than one character for a register v8.2.2497
authorBram Moolenaar <Bram@vim.org>
Wed, 10 Feb 2021 21:23:41 +0000 (22:23 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 10 Feb 2021 21:23:41 +0000 (22:23 +0100)
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.

src/errors.h
src/evalfunc.c
src/testdir/test_vim9_builtin.vim
src/typval.c
src/version.c

index aaf7e552c9b830c52919de3d45d7318580ae70c4..39eca7e9431646c7b74bf996ea42f5c71fb0693e 100644 (file)
@@ -359,3 +359,5 @@ EXTERN char e_cannot_use_default_for_variable_arguments[]
        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"));
index 01994b047563dcac39eb2b9bb460516e2b87500f..b3da9f6cf6f4e365c71fc059ee77192d11d5e551 100644 (file)
@@ -4285,7 +4285,13 @@ f_getreg(typval_T *argvars, typval_T *rettv)
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
        strregname = tv_get_string_chk(&argvars[0]);
-       error = strregname == NULL;
+       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,6 +4341,11 @@ f_getregtype(typval_T *argvars, typval_T *rettv)
     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,6 +7379,11 @@ f_getreginfo(typval_T *argvars, typval_T *rettv)
        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,7 +7426,7 @@ f_getreginfo(typval_T *argvars, typval_T *rettv)
        {
            item->di_tv.v_type = VAR_SPECIAL;
            item->di_tv.vval.v_number = regname == buf[0]
-               ? VVAL_TRUE : VVAL_FALSE;
+                                                     ? VVAL_TRUE : VVAL_FALSE;
            (void)dict_add(dict, item);
        }
     }
@@ -8472,6 +8488,11 @@ f_setreg(typval_T *argvars, typval_T *rettv)
 
     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 = '"';
index eb36bd77a159bb144be9b0074d82e567757ab818..cb36990657b574d893b816ad3d74b9597aea4025 100644 (file)
@@ -531,6 +531,7 @@ def Test_getreg()
   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,6 +540,20 @@ def Test_getreg_return_type()
   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,6 +893,7 @@ def Test_setreg()
   var reginfo = getreginfo('a')
   setreg('a', reginfo)
   getreginfo('a')->assert_equal(reginfo)
+  assert_fails('setreg("ab", 0)', 'E1162:')
 enddef 
 
 def Test_slice()
index 65e07b3f79fc1117f20f8e7d691dfdd40d5ff144..1cdab93ef11d64235570d8ceab0e38756d964b37 100644 (file)
@@ -1069,7 +1069,9 @@ tv_equal(
        return r;
     }
 
-    if (tv1->v_type != tv2->v_type)
+    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)
index 3c9edfdce9bd2d98e4f265eadbf17b39c7fe002e..55dd8d164e34f190c0d67ab88514ddc03d37c4b6 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2497,
 /**/
     2496,
 /**/