aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKunMing Xie <qqzz014@gmail.com>2017-08-07 05:03:08 +0800
committerJustin M. Keyes <justinkz@gmail.com>2017-08-06 23:03:08 +0200
commitd1f0b5aa5d594f3041c3fc6c026ff720c07beaeb (patch)
tree2b09090c79dd56aad21ea6a74bfea135dc668c3a
parent36ceb9397c7fc383356e54ea8eab8fa3d6cefb1f (diff)
downloadrneovim-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.c11
-rw-r--r--src/nvim/testdir/test_nested_function.vim21
-rw-r--r--src/nvim/version.c2
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,