mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.2.4224: Vim9: no error when using a number for map() second argument
Problem: Vim9: no error when using a number for map() second argument Solution: Disallow number to string conversion. (closes #9630)
This commit is contained in:
@@ -291,7 +291,7 @@ eval_expr_typval(typval_T *expr, typval_T *argv, int argc, typval_T *rettv)
|
||||
}
|
||||
else
|
||||
{
|
||||
s = tv_get_string_buf_chk(expr, buf);
|
||||
s = tv_get_string_buf_chk_strict(expr, buf, TRUE);
|
||||
if (s == NULL)
|
||||
return FAIL;
|
||||
s = skipwhite(s);
|
||||
|
@@ -491,8 +491,15 @@ arg_list_or_dict_or_blob_or_string(type_T *type, type_T *decl_type UNUSED, argco
|
||||
static int
|
||||
arg_filter_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||
{
|
||||
if (type->tt_type == VAR_FUNC
|
||||
&& !(type->tt_member->tt_type == VAR_BOOL
|
||||
if (type->tt_type == VAR_STRING
|
||||
|| type->tt_type == VAR_PARTIAL
|
||||
|| type == &t_unknown
|
||||
|| type == &t_any)
|
||||
return OK;
|
||||
|
||||
if (type->tt_type == VAR_FUNC)
|
||||
{
|
||||
if (!(type->tt_member->tt_type == VAR_BOOL
|
||||
|| type->tt_member->tt_type == VAR_NUMBER
|
||||
|| type->tt_member->tt_type == VAR_UNKNOWN
|
||||
|| type->tt_member->tt_type == VAR_ANY))
|
||||
@@ -500,6 +507,12 @@ arg_filter_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||
arg_type_mismatch(&t_func_bool, type, context->arg_idx + 1);
|
||||
return FAIL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
semsg(_(e_string_or_function_required_for_argument_nr), 2);
|
||||
return FAIL;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -509,8 +522,15 @@ arg_filter_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||
static int
|
||||
arg_map_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||
{
|
||||
if (type->tt_type == VAR_FUNC
|
||||
&& type->tt_member != &t_any
|
||||
if (type->tt_type == VAR_STRING
|
||||
|| type->tt_type == VAR_PARTIAL
|
||||
|| type == &t_unknown
|
||||
|| type == &t_any)
|
||||
return OK;
|
||||
|
||||
if (type->tt_type == VAR_FUNC)
|
||||
{
|
||||
if (type->tt_member != &t_any
|
||||
&& type->tt_member != &t_unknown)
|
||||
{
|
||||
type_T *expected = NULL;
|
||||
@@ -530,6 +550,12 @@ arg_map_func(type_T *type, type_T *decl_type UNUSED, argcontext_T *context)
|
||||
return check_arg_type(&t_func_exp, type, context);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
semsg(_(e_string_or_function_required_for_argument_nr), 2);
|
||||
return FAIL;
|
||||
}
|
||||
return OK;
|
||||
}
|
||||
|
||||
|
@@ -1275,6 +1275,7 @@ enddef
|
||||
|
||||
def Test_filter()
|
||||
CheckDefAndScriptFailure(['filter(1.1, "1")'], ['E1013: Argument 1: type mismatch, expected list<any> but got float', 'E1251: List, Dictionary, Blob or String required for argument 1'])
|
||||
CheckDefAndScriptFailure(['filter([1, 2], 4)'], ['E1256: String or function required for argument 2', 'E1024: Using a Number as a String'])
|
||||
|
||||
var lines =<< trim END
|
||||
def F(i: number, v: any): string
|
||||
@@ -2153,6 +2154,7 @@ def Test_map()
|
||||
CheckDefAndScriptFailure(['map(test_null_channel(), "1")'], ['E1013: Argument 1: type mismatch, expected list<any> but got channel', 'E1251: List, Dictionary, Blob or String required for argument 1'])
|
||||
endif
|
||||
CheckDefAndScriptFailure(['map(1, "1")'], ['E1013: Argument 1: type mismatch, expected list<any> but got number', 'E1251: List, Dictionary, Blob or String required for argument 1'])
|
||||
CheckDefAndScriptFailure(['map([1, 2], 4)'], ['E1256: String or function required for argument 2', 'E1024: Using a Number as a String'])
|
||||
|
||||
# type of dict remains dict<any> even when type of values changes
|
||||
# same for list
|
||||
|
@@ -750,6 +750,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
4224,
|
||||
/**/
|
||||
4223,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user