1
0
forked from aniani/vim

patch 8.2.3188: Vim9: argument types are not checked at compile time

Problem:    Vim9: argument types are not checked at compile time.
Solution:   Add several more type checks, also at runtime. (Yegappan
            Lakshmanan, closes #8587)
This commit is contained in:
Yegappan Lakshmanan
2021-07-20 17:51:51 +02:00
committed by Bram Moolenaar
parent 9bb0dad0d8
commit 83494b4ac6
34 changed files with 1417 additions and 299 deletions

View File

@@ -158,6 +158,12 @@ f_prop_add(typval_T *argvars, typval_T *rettv UNUSED)
linenr_T start_lnum;
colnr_T start_col;
if (in_vim9script()
&& (check_for_number_arg(argvars, 0) == FAIL
|| check_for_number_arg(argvars, 1) == FAIL
|| check_for_dict_arg(argvars, 2) == FAIL))
return;
start_lnum = tv_get_number(&argvars[0]);
start_col = tv_get_number(&argvars[1]);
if (start_col < 1)
@@ -532,12 +538,21 @@ text_prop_type_by_id(buf_T *buf, int id)
void
f_prop_clear(typval_T *argvars, typval_T *rettv UNUSED)
{
linenr_T start = tv_get_number(&argvars[0]);
linenr_T end = start;
linenr_T start;
linenr_T end;
linenr_T lnum;
buf_T *buf = curbuf;
int did_clear = FALSE;
if (in_vim9script()
&& (check_for_number_arg(argvars, 0) == FAIL
|| check_for_opt_number_arg(argvars, 1) == FAIL
|| (argvars[1].v_type != VAR_UNKNOWN
&& check_for_opt_dict_arg(argvars, 2) == FAIL)))
return;
start = tv_get_number(&argvars[0]);
end = start;
if (argvars[1].v_type != VAR_UNKNOWN)
{
end = tv_get_number(&argvars[1]);
@@ -774,8 +789,7 @@ f_prop_list(typval_T *argvars, typval_T *rettv)
if (in_vim9script()
&& (check_for_number_arg(argvars, 0) == FAIL
|| (argvars[1].v_type != VAR_UNKNOWN &&
check_for_dict_arg(argvars, 1) == FAIL)))
|| check_for_opt_dict_arg(argvars, 1) == FAIL))
return;
lnum = tv_get_number(&argvars[0]);
@@ -832,6 +846,14 @@ f_prop_remove(typval_T *argvars, typval_T *rettv)
int both;
rettv->vval.v_number = 0;
if (in_vim9script()
&& (check_for_dict_arg(argvars, 0) == FAIL
|| check_for_opt_number_arg(argvars, 1) == FAIL
|| (argvars[1].v_type != VAR_UNKNOWN
&& check_for_opt_number_arg(argvars, 2) == FAIL)))
return;
if (argvars[0].v_type != VAR_DICT || argvars[0].vval.v_dict == NULL)
{
emsg(_(e_invarg));