diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2023-12-16 14:36:08 +0100 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-12-16 14:36:08 +0100 |
commit | a185a31fc05c2dd15315cd59afc02b69aabb5893 (patch) | |
tree | 8ea80a62b1ca0270e484c1fd102cf9a2954cebe9 | |
parent | 535e8f59410a4d3065829e010bc5e13608a968cc (diff) |
patch 9.0.2172: Vim9: compiling :defer may failv9.0.2172
Problem: Vim9: compiling :defer may fail
Solution: compile defer, when ctx_skip is not SKIP_YES
compiling defer fails in an if statement with false condition,
so check the ctx_skip value when compiling :defer
fixes: #13698
closes: #13702
Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | src/testdir/test_vim9_script.vim | 13 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9cmds.c | 42 |
3 files changed, 38 insertions, 19 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index b64f05e89d..2aca20ad8d 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -4783,6 +4783,19 @@ def Test_multidefer_with_exception() v9.CheckSourceSuccess(lines) enddef +" Test for using ":defer" inside an if statement with a false condition +def Test_defer_skipped() + var lines =<< trim END + def Foo() + if false + defer execute('echow "hello"', "") + endif + enddef + defcompile + END + v9.CheckSourceSuccess(lines) +enddef + " Keep this last, it messes up highlighting. def Test_substitute_cmd() new diff --git a/src/version.c b/src/version.c index de90fcec5a..213a0e7c21 100644 --- a/src/version.c +++ b/src/version.c @@ -705,7 +705,7 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ - 2171, + 2172, /**/ 2170, /**/ diff --git a/src/vim9cmds.c b/src/vim9cmds.c index 392bab4120..07e6501a9b 100644 --- a/src/vim9cmds.c +++ b/src/vim9cmds.c @@ -2020,11 +2020,14 @@ compile_defer(char_u *arg_start, cctx_T *cctx) *paren = '('; // check for function type - type = get_type_on_stack(cctx, 0); - if (type->tt_type != VAR_FUNC) + if (cctx->ctx_skip != SKIP_YES) { - emsg(_(e_function_name_required)); - return NULL; + type = get_type_on_stack(cctx, 0); + if (type->tt_type != VAR_FUNC) + { + emsg(_(e_function_name_required)); + return NULL; + } } // compile the arguments @@ -2032,24 +2035,27 @@ compile_defer(char_u *arg_start, cctx_T *cctx) if (compile_arguments(&arg, cctx, &argcount, CA_NOT_SPECIAL) == FAIL) return NULL; - if (func_idx >= 0) + if (cctx->ctx_skip != SKIP_YES) { - type2_T *argtypes = NULL; - type2_T shuffled_argtypes[MAX_FUNC_ARGS]; + if (func_idx >= 0) + { + type2_T *argtypes = NULL; + type2_T shuffled_argtypes[MAX_FUNC_ARGS]; - if (check_internal_func_args(cctx, func_idx, argcount, FALSE, - &argtypes, shuffled_argtypes) == FAIL) + if (check_internal_func_args(cctx, func_idx, argcount, FALSE, + &argtypes, shuffled_argtypes) == FAIL) + return NULL; + } + else if (check_func_args_from_type(cctx, type, argcount, TRUE, + arg_start) == FAIL) return NULL; - } - else if (check_func_args_from_type(cctx, type, argcount, TRUE, - arg_start) == FAIL) - return NULL; - defer_var_idx = get_defer_var_idx(cctx); - if (defer_var_idx == 0) - return NULL; - if (generate_DEFER(cctx, defer_var_idx - 1, argcount) == FAIL) - return NULL; + defer_var_idx = get_defer_var_idx(cctx); + if (defer_var_idx == 0) + return NULL; + if (generate_DEFER(cctx, defer_var_idx - 1, argcount) == FAIL) + return NULL; + } return skipwhite(arg); } |