Mercurial > vim
diff src/evalfunc.c @ 27392:ec2ba9acec1b v8.2.4224
patch 8.2.4224: Vim9: no error when using a number for map() second argument
Commit: https://github.com/vim/vim/commit/1080c48ec8d672d7e9fbefb5a1255c9df09a2884
Author: Bram Moolenaar <Bram@vim.org>
Date: Wed Jan 26 18:26:21 2022 +0000
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 https://github.com/vim/vim/issues/9630)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Wed, 26 Jan 2022 19:30:03 +0100 |
parents | 69aa20a6e7ae |
children | 69a48bcd1d80 |
line wrap: on
line diff
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -491,13 +491,26 @@ arg_list_or_dict_or_blob_or_string(type_ 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)) - { - arg_type_mismatch(&t_func_bool, type, context->arg_idx + 1); + { + 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,26 +522,39 @@ arg_filter_func(type_T *type, type_T *de 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; - - if (context->arg_types[0].type_curr->tt_type == VAR_LIST - || context->arg_types[0].type_curr->tt_type == VAR_DICT) - expected = context->arg_types[0].type_curr->tt_member; - else if (context->arg_types[0].type_curr->tt_type == VAR_STRING) - expected = &t_string; - else if (context->arg_types[0].type_curr->tt_type == VAR_BLOB) - expected = &t_number; - if (expected != NULL) - { - type_T t_func_exp = {VAR_FUNC, -1, 0, TTFLAG_STATIC, NULL, NULL}; - - t_func_exp.tt_member = expected; - return check_arg_type(&t_func_exp, type, context); - } + { + type_T *expected = NULL; + + if (context->arg_types[0].type_curr->tt_type == VAR_LIST + || context->arg_types[0].type_curr->tt_type == VAR_DICT) + expected = context->arg_types[0].type_curr->tt_member; + else if (context->arg_types[0].type_curr->tt_type == VAR_STRING) + expected = &t_string; + else if (context->arg_types[0].type_curr->tt_type == VAR_BLOB) + expected = &t_number; + if (expected != NULL) + { + type_T t_func_exp = {VAR_FUNC, -1, 0, TTFLAG_STATIC, NULL, NULL}; + + t_func_exp.tt_member = expected; + return check_arg_type(&t_func_exp, type, context); + } + } + } + else + { + semsg(_(e_string_or_function_required_for_argument_nr), 2); + return FAIL; } return OK; }