diff options
author | KunMing Xie <qqzz014@gmail.com> | 2017-08-07 05:03:08 +0800 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2017-08-06 23:03:08 +0200 |
commit | d1f0b5aa5d594f3041c3fc6c026ff720c07beaeb (patch) | |
tree | 2b09090c79dd56aad21ea6a74bfea135dc668c3a | |
parent | 36ceb9397c7fc383356e54ea8eab8fa3d6cefb1f (diff) | |
download | rneovim-d1f0b5aa5d594f3041c3fc6c026ff720c07beaeb.tar.gz rneovim-d1f0b5aa5d594f3041c3fc6c026ff720c07beaeb.tar.bz2 rneovim-d1f0b5aa5d594f3041c3fc6c026ff720c07beaeb.zip |
vim-patch:8.0.0137 (#7119)
Problem: When 'maxfuncdepth' is set above 200 the nesting is limited to
200. (Brett Stahlman)
Solution: Allow for Ex command recursion depending on 'maxfuncdepth'.
https://github.com/vim/vim/commit/777b30f827bcbe10a40640b1bf0361cb93a16be1
-rw-r--r-- | src/nvim/ex_docmd.c | 11 | ||||
-rw-r--r-- | src/nvim/testdir/test_nested_function.vim | 21 | ||||
-rw-r--r-- | src/nvim/version.c | 2 |
3 files changed, 28 insertions, 6 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 1a766821a9..29788a9865 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -340,12 +340,13 @@ int do_cmdline(char_u *cmdline, LineGetter fgetline, msg_list = &private_msg_list; private_msg_list = NULL; - /* It's possible to create an endless loop with ":execute", catch that - * here. The value of 200 allows nested function calls, ":source", etc. */ - if (call_depth == 200) { + // It's possible to create an endless loop with ":execute", catch that + // here. The value of 200 allows nested function calls, ":source", etc. + // Allow 200 or 'maxfuncdepth', whatever is larger. + if (call_depth >= 200 && call_depth >= p_mfd) { EMSG(_("E169: Command too recursive")); - /* When converting to an exception, we do not include the command name - * since this is not an error of the specific command. */ + // When converting to an exception, we do not include the command name + // since this is not an error of the specific command. do_errthrow((struct condstack *)NULL, (char_u *)NULL); msg_list = saved_msg_list; return FAIL; diff --git a/src/nvim/testdir/test_nested_function.vim b/src/nvim/testdir/test_nested_function.vim index 7e301ed33e..afaaea6ceb 100644 --- a/src/nvim/testdir/test_nested_function.vim +++ b/src/nvim/testdir/test_nested_function.vim @@ -40,3 +40,24 @@ func Test_nested_argument() delfunc g:X unlet g:Y endfunc + +func Recurse(count) + if a:count > 0 + call Recurse(a:count - 1) + endif +endfunc + +func Test_max_nesting() + let call_depth_here = 2 + let ex_depth_here = 5 + set mfd& + + call Recurse(99 - call_depth_here) + call assert_fails('call Recurse(' . (100 - call_depth_here) . ')', 'E132:') + + set mfd=210 + call Recurse(209 - ex_depth_here) + call assert_fails('call Recurse(' . (210 - ex_depth_here) . ')', 'E169:') + + set mfd& +endfunc diff --git a/src/nvim/version.c b/src/nvim/version.c index 9305618eae..fd2f1fd212 100644 --- a/src/nvim/version.c +++ b/src/nvim/version.c @@ -815,7 +815,7 @@ static const int included_patches[] = { // 140, // 139 NA // 138 NA - // 137, + 137, 136, 135, 134, |