# HG changeset patch # User Bram Moolenaar # Date 1644704103 -3600 # Node ID 1646525507aaabc8bb9f4e4c7ffa14caf701a630 # Parent 567f4f964ccc93f112aff2772d147e81ea1cd97b patch 8.2.4365: sticky command modifiers are too sticky Commit: https://github.com/vim/vim/commit/cdf04859699bdde891b5b52ea821d0bebd7e8ee0 Author: Bram Moolenaar Date: Sat Feb 12 22:13:06 2022 +0000 patch 8.2.4365: sticky command modifiers are too sticky Problem: sticky command modifiers are too sticky. Solution: Do not apply command modifiers to a called function. (closes https://github.com/vim/vim/issues/9751) diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -118,6 +118,20 @@ def Test_cmdmod_execute() END v9.CheckScriptSuccess(lines) delete('Xvim9import.vim') + + # "legacy" does not aply to a called function + lines =<< trim END + vim9script + + def g:TheFunc() + if exists('something') + echo 'yes' + endif + enddef + legacy exe 'call g:TheFunc()' + END + v9.CheckScriptSuccess(lines) + delfunc g:TheFunc enddef def Test_edit_wildcards() diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -2513,6 +2513,7 @@ call_user_func( { sctx_T save_current_sctx; int using_sandbox = FALSE; + int save_sticky_cmdmod_flags = sticky_cmdmod_flags; funccall_T *fc; int save_did_emsg; int default_arg_err = FALSE; @@ -2569,6 +2570,7 @@ call_user_func( if (do_profiling == PROF_YES) profile_may_start_func(&profile_info, fp, caller); #endif + sticky_cmdmod_flags = 0; call_def_function(fp, argcount, argvars, funcexe->fe_partial, rettv); funcdepth_decrement(); #ifdef FEAT_PROFILE @@ -2578,6 +2580,7 @@ call_user_func( #endif current_funccal = fc->caller; free_funccal(fc); + sticky_cmdmod_flags = save_sticky_cmdmod_flags; return; } @@ -2797,6 +2800,9 @@ call_user_func( fc->caller == NULL ? NULL : fc->caller->func); #endif + // "legacy" does not apply to commands in the function + sticky_cmdmod_flags = 0; + save_current_sctx = current_sctx; current_sctx = fp->uf_script_ctx; save_did_emsg = did_emsg; @@ -2889,6 +2895,7 @@ call_user_func( #endif if (using_sandbox) --sandbox; + sticky_cmdmod_flags = save_sticky_cmdmod_flags; if (p_verbose >= 12 && SOURCING_NAME != NULL) { diff --git a/src/version.c b/src/version.c --- 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 */ /**/ + 4365, +/**/ 4364, /**/ 4363,