diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2022-04-03 21:30:32 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-03 21:30:32 +0100 |
commit | 2b74b6805b5c8c4836b66df5d949f5ff6a77f8c7 (patch) | |
tree | b43c7e0c3a0f359db844e5e3434ce1f7ef522e3c /src | |
parent | 1061195057c4518877cb6da7591eadff9db14598 (diff) |
patch 8.2.4679: cannot have expandcmd() give an error message for mistakesv8.2.4679
Problem: Cannot have expandcmd() give an error message for mistakes.
Solution: Add an optional argument to give errors. Fix memory leak when
expanding files fails. (Yegappan Lakshmanan, closes #10071)
Diffstat (limited to 'src')
-rw-r--r-- | src/evalfunc.c | 22 | ||||
-rw-r--r-- | src/filepath.c | 2 | ||||
-rw-r--r-- | src/testdir/test_expand.vim | 18 | ||||
-rw-r--r-- | src/testdir/test_vim9_builtin.vim | 1 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 36 insertions, 9 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c index 5a0428ecff..4829673464 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -1761,7 +1761,7 @@ static funcentry_T global_functions[] = ret_float, FLOAT_FUNC(f_exp)}, {"expand", 1, 3, FEARG_1, arg3_string_bool_bool, ret_any, f_expand}, - {"expandcmd", 1, 1, FEARG_1, arg1_string, + {"expandcmd", 1, 2, FEARG_1, arg2_string_dict, ret_string, f_expandcmd}, {"extend", 2, 3, FEARG_1, arg23_extend, ret_extend, f_extend}, @@ -4152,10 +4152,18 @@ f_expandcmd(typval_T *argvars, typval_T *rettv) exarg_T eap; char_u *cmdstr; char *errormsg = NULL; + int emsgoff = TRUE; - if (in_vim9script() && check_for_string_arg(argvars, 0) == FAIL) + if (in_vim9script() + && (check_for_string_arg(argvars, 0) == FAIL + || check_for_opt_dict_arg(argvars, 1) == FAIL)) return; + if (argvars[1].v_type == VAR_DICT + && dict_get_bool(argvars[1].vval.v_dict, (char_u *)"errmsg", + VVAL_FALSE)) + emsgoff = FALSE; + rettv->v_type = VAR_STRING; cmdstr = vim_strsave(tv_get_string(&argvars[0])); @@ -4167,9 +4175,13 @@ f_expandcmd(typval_T *argvars, typval_T *rettv) eap.nextcmd = NULL; eap.cmdidx = CMD_USER; - ++emsg_off; - expand_filename(&eap, &cmdstr, &errormsg); - --emsg_off; + if (emsgoff) + ++emsg_off; + if (expand_filename(&eap, &cmdstr, &errormsg) == FAIL) + if (!emsgoff && errormsg != NULL && *errormsg != NUL) + emsg(errormsg); + if (emsgoff) + --emsg_off; rettv->vval.v_string = cmdstr; } diff --git a/src/filepath.c b/src/filepath.c index 5bf31ea8e8..3786ef6330 100644 --- a/src/filepath.c +++ b/src/filepath.c @@ -3999,7 +3999,7 @@ gen_expand_wildcards( // When returning FAIL the array must be freed here. if (retval == FAIL) - ga_clear(&ga); + ga_clear_strings(&ga); *num_file = ga.ga_len; *file = (ga.ga_data != NULL) ? (char_u **)ga.ga_data diff --git a/src/testdir/test_expand.vim b/src/testdir/test_expand.vim index ce414e4b11..638f9c7c34 100644 --- a/src/testdir/test_expand.vim +++ b/src/testdir/test_expand.vim @@ -90,14 +90,26 @@ func Test_expandcmd() " Test for expression expansion `= let $FOO= "blue" call assert_equal("blue sky", expandcmd("`=$FOO .. ' sky'`")) + let x = expandcmd("`=axbycz`") + call assert_equal('`=axbycz`', x) + call assert_fails('let x = expandcmd("`=axbycz`", #{errmsg: 1})', 'E121:') + let x = expandcmd("`=axbycz`", #{abc: []}) + call assert_equal('`=axbycz`', x) " Test for env variable with spaces let $FOO= "foo bar baz" call assert_equal("e foo bar baz", expandcmd("e $FOO")) - if has('unix') - " test for using the shell to expand a command argument - call assert_equal('{1..4}', expandcmd('{1..4}')) + if has('unix') && executable('bash') + " test for using the shell to expand a command argument. + " only bash supports the {..} syntax + set shell=bash + let x = expandcmd('{1..4}') + call assert_equal('{1..4}', x) + call assert_fails("let x = expandcmd('{1..4}', #{errmsg: v:true})", 'E77:') + let x = expandcmd('{1..4}', #{error: v:true}) + call assert_equal('{1..4}', x) + set shell& endif unlet $FOO diff --git a/src/testdir/test_vim9_builtin.vim b/src/testdir/test_vim9_builtin.vim index 01f29d9d2b..b20ff144ca 100644 --- a/src/testdir/test_vim9_builtin.vim +++ b/src/testdir/test_vim9_builtin.vim @@ -1020,6 +1020,7 @@ def Test_expandcmd() expandcmd('')->assert_equal('') v9.CheckDefAndScriptFailure(['expandcmd([1])'], ['E1013: Argument 1: type mismatch, expected string but got list<number>', 'E1174: String required for argument 1']) + v9.CheckDefAndScriptFailure(['expandcmd("abc", [])'], ['E1013: Argument 2: type mismatch, expected dict<any> but got list<unknown>', 'E1206: Dictionary required for argument 2']) enddef def Test_extend_arg_types() diff --git a/src/version.c b/src/version.c index 22191c9976..fda6f6abc2 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4679, +/**/ 4678, /**/ 4677, |