]> granicus.if.org Git - vim/commitdiff
patch 8.2.3916: no error for passing an invalid line number to append() v8.2.3916
authorBram Moolenaar <Bram@vim.org>
Mon, 27 Dec 2021 20:57:06 +0000 (20:57 +0000)
committerBram Moolenaar <Bram@vim.org>
Mon, 27 Dec 2021 20:57:06 +0000 (20:57 +0000)
Problem:    No error for passing an invalid line number to append().
Solution:   In Vim9 script check for a non-negative number. (closes #9417)

src/errors.h
src/eval.c
src/evalbuffer.c
src/indent.c
src/testdir/test_vim9_builtin.vim
src/textprop.c
src/version.c

index c629953eb651d16f4a5bb2e5044b23eba8a71c38..5ca74cc1d09225ec3158a5464f023860d96919f7 100644 (file)
@@ -357,6 +357,10 @@ EXTERN char e_using_invalid_value_as_string_str[]
 EXTERN char e_cannot_index_special_variable[]
        INIT(= N_("E909: Cannot index a special variable"));
 #endif
+EXTERN char_u e_invalid_column_number_nr[]
+       INIT(= N_("E964: Invalid column number: %ld"));
+EXTERN char_u e_invalid_line_number_nr[]
+       INIT(= N_("E966: Invalid line number: %ld"));
 EXTERN char e_command_not_supported_in_vim9_script_missing_var_str[]
        INIT(= N_("E1100: Command not supported in Vim9 script (missing :var?): %s"));
 #ifdef FEAT_EVAL
index 4e720e8e234c578dadcfcbe63c2fb0464785a87c..40a5910461c75ddf1153ca95c45657326e6775df 100644 (file)
@@ -5359,8 +5359,9 @@ var2fpos(
     name = tv_get_string_chk(varp);
     if (name == NULL)
        return NULL;
-    if (name[0] == '.')                                // cursor
+    if (name[0] == '.' && (!in_vim9script() || name[1] == NUL))
     {
+       // cursor
        pos = curwin->w_cursor;
        if (charcol)
            pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
@@ -5376,8 +5377,10 @@ var2fpos(
            pos.col = buf_byteidx_to_charidx(curbuf, pos.lnum, pos.col);
        return &pos;
     }
-    if (name[0] == '\'')                       // mark
+    if (name[0] == '\'' && (!in_vim9script()
+                                       || (name[1] != NUL && name[2] == NUL)))
     {
+       // mark
        pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum);
        if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0)
            return NULL;
index ba16436ded04d14e9dbc542d91dfe816e3b5d123..50d26c4b17f60c047e4a00c1b41137b50cb707b2 100644 (file)
@@ -151,6 +151,8 @@ set_buffer_lines(
     if (buf == NULL || (!is_curbuf && buf->b_ml.ml_mfp == NULL) || lnum < 1)
     {
        rettv->vval.v_number = 1;       // FAIL
+       if (in_vim9script() && lnum < 1)
+           semsg(_(e_invalid_line_number_nr), lnum_arg);
        return;
     }
 
index 51af4df06babce4eb5a6ac6da72ca448dc6a51c0..ed1b7998cb021356d41cba79b2939ed26f06a64a 100644 (file)
@@ -2130,7 +2130,11 @@ f_indent(typval_T *argvars, typval_T *rettv)
     if (lnum >= 1 && lnum <= curbuf->b_ml.ml_line_count)
        rettv->vval.v_number = get_indent_lnum(lnum);
     else
+    {
+       if (in_vim9script())
+           semsg(_(e_invalid_line_number_nr), lnum);
        rettv->vval.v_number = -1;
+    }
 }
 
 /*
@@ -2154,6 +2158,8 @@ f_lispindent(typval_T *argvars UNUSED, typval_T *rettv)
        rettv->vval.v_number = get_lisp_indent();
        curwin->w_cursor = pos;
     }
+    else if (in_vim9script())
+       semsg(_(e_invalid_line_number_nr), lnum);
     else
 #endif
        rettv->vval.v_number = -1;
index bc59e3af128d8fddd7de975356a8361ff957d483..d528b71a65bb53f5ced76c5532abd77ae172c7df 100644 (file)
@@ -182,6 +182,9 @@ def Test_append()
   assert_equal("function('min')", getline(1))
   CheckDefAndScriptFailure(['append([1], "x")'], ['E1013: Argument 1: type mismatch, expected string but got list<number>', 'E1220: String or Number required for argument 1'])
   CheckDefExecAndScriptFailure(['append("", "x")'], 'E1209: Invalid value for a line number')
+  CheckDefExecAndScriptFailure(['append(".a", "x")'], 'E1209: Invalid value for a line number')
+  CheckDefExecAndScriptFailure(['append("''aa", "x")'], 'E1209: Invalid value for a line number')
+  CheckDefExecAndScriptFailure(['append(-1, "x")'], 'E966: Invalid line number: -1')
   bwipe!
 enddef
 
@@ -199,6 +202,7 @@ def Test_appendbufline()
   assert_equal(['zero'], getbufline(bnum, 1))
   CheckDefAndScriptFailure(['appendbufline([1], 1, "x")'], ['E1013: Argument 1: type mismatch, expected string but got list<number>', 'E1220: String or Number required for argument 1'])
   CheckDefAndScriptFailure(['appendbufline(1, [1], "x")'], ['E1013: Argument 2: type mismatch, expected string but got list<number>', 'E1220: String or Number required for argument 2'])
+  CheckDefExecAndScriptFailure(['appendbufline(' .. bnum .. ', -1, "x")'], 'E966: Invalid line number: -1')
   CheckDefAndScriptFailure(['appendbufline(1, 1, {"a": 10})'], ['E1013: Argument 3: type mismatch, expected string but got dict<number>', 'E1224: String, Number or List required for argument 3'])
   bnum->bufwinid()->win_gotoid()
   appendbufline('', 0, 'numbers')
@@ -1834,6 +1838,7 @@ def Test_indent()
   CheckDefAndScriptFailure(['indent([1])'], ['E1013: Argument 1: type mismatch, expected string but got list<number>', 'E1220: String or Number required for argument 1'])
   CheckDefAndScriptFailure(['indent(true)'], ['E1013: Argument 1: type mismatch, expected string but got bool', 'E1220: String or Number required for argument 1'])
   CheckDefExecAndScriptFailure(['indent("")'], 'E1209: Invalid value for a line number')
+  CheckDefExecAndScriptFailure(['indent(-1)'], 'E966: Invalid line number: -1')
   assert_equal(0, indent(1))
 enddef
 
@@ -2061,6 +2066,7 @@ enddef
 def Test_lispindent()
   CheckDefAndScriptFailure(['lispindent({})'], ['E1013: Argument 1: type mismatch, expected string but got dict<unknown>', 'E1220: String or Number required for argument 1'])
   CheckDefExecAndScriptFailure(['lispindent("")'], 'E1209: Invalid value for a line number')
+  CheckDefExecAndScriptFailure(['lispindent(-1)'], 'E966: Invalid line number: -1')
   assert_equal(0, lispindent(1))
 enddef
 
@@ -3239,6 +3245,7 @@ def Test_setbufline()
   assert_equal(['1', '2', '3', 'one', '10', 'two', '11'], getbufline(bnum, 1, '$'))
   CheckDefAndScriptFailure(['setbufline([1], 1, "x")'], ['E1013: Argument 1: type mismatch, expected string but got list<number>', 'E1220: String or Number required for argument 1'])
   CheckDefAndScriptFailure(['setbufline(1, [1], "x")'], ['E1013: Argument 2: type mismatch, expected string but got list<number>', 'E1220: String or Number required for argument 2'])
+  CheckDefExecAndScriptFailure(['setbufline(' .. bnum .. ', -1, "x")'], 'E966: Invalid line number: -1')
   CheckDefAndScriptFailure(['setbufline(1, 1, {"a": 10})'], ['E1013: Argument 3: type mismatch, expected string but got dict<number>', 'E1224: String, Number or List required for argument 3'])
   bnum->bufwinid()->win_gotoid()
   setbufline('', 1, 'nombres')
@@ -3303,6 +3310,7 @@ def Test_setline()
   assert_equal(['10', 'b', 'c', 'd'], getline(1, '$'))
   CheckDefAndScriptFailure(['setline([1], "x")'], ['E1013: Argument 1: type mismatch, expected string but got list<number>', 'E1220: String or Number required for argument 1'])
   CheckDefExecAndScriptFailure(['setline("", "x")'], 'E1209: Invalid value for a line number')
+  CheckDefExecAndScriptFailure(['setline(-1, "x")'], 'E966: Invalid line number: -1')
   bw!
 enddef
 
index beb82a35b5119224c97646c622feddec1a7f039d..b3dac1f7efefb4686617ffdede7f6d0a5de26b74 100644 (file)
@@ -48,8 +48,6 @@ static hashtab_T *global_proptypes = NULL;
 static int proptype_id = 0;
 
 static char_u e_type_not_exist[] = N_("E971: Property type %s does not exist");
-static char_u e_invalid_col[] = N_("E964: Invalid column number: %ld");
-static char_u e_invalid_lnum[] = N_("E966: Invalid line number: %ld");
 
 /*
  * Find a property type by name, return the hashitem.
@@ -169,7 +167,7 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
     start_col = tv_get_number(&argvars[1]);
     if (start_col < 1)
     {
-       semsg(_(e_invalid_col), (long)start_col);
+       semsg(_(e_invalid_column_number_nr), (long)start_col);
        return;
     }
     if (argvars[2].v_type != VAR_DICT)
@@ -213,12 +211,12 @@ prop_add_one(
 
     if (start_lnum < 1 || start_lnum > buf->b_ml.ml_line_count)
     {
-       semsg(_(e_invalid_lnum), (long)start_lnum);
+       semsg(_(e_invalid_line_number_nr), (long)start_lnum);
        return FAIL;
     }
     if (end_lnum < start_lnum || end_lnum > buf->b_ml.ml_line_count)
     {
-       semsg(_(e_invalid_lnum), (long)end_lnum);
+       semsg(_(e_invalid_line_number_nr), (long)end_lnum);
        return FAIL;
     }
 
@@ -243,7 +241,7 @@ prop_add_one(
            col = 1;
        if (col - 1 > (colnr_T)textlen)
        {
-           semsg(_(e_invalid_col), (long)start_col);
+           semsg(_(e_invalid_column_number_nr), (long)start_col);
            return FAIL;
        }
 
index 7b454a689c5fc89911bb2ccc080941b81795cae5..944b1f6add58c291dfd01ad8c1afed65b6eceffd 100644 (file)
@@ -749,6 +749,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3916,
 /**/
     3915,
 /**/