summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYegappan Lakshmanan <yegappan@yahoo.com>2023-12-16 14:36:08 +0100
committerChristian Brabandt <cb@256bit.org>2023-12-16 14:36:08 +0100
commita185a31fc05c2dd15315cd59afc02b69aabb5893 (patch)
tree8ea80a62b1ca0270e484c1fd102cf9a2954cebe9
parent535e8f59410a4d3065829e010bc5e13608a968cc (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.vim13
-rw-r--r--src/version.c2
-rw-r--r--src/vim9cmds.c42
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);
}