diff options
author | Bram Moolenaar <bram@vim.org> | 2013-11-11 04:25:53 +0100 |
---|---|---|
committer | Bram Moolenaar <bram@vim.org> | 2013-11-11 04:25:53 +0100 |
commit | 7b167e03a287e40b089c621e4de00ea5446dcac2 (patch) | |
tree | 68d5961931ac77887b29736a747a75bc64da4a71 | |
parent | 75e22e0e55157d7f3c8f709ec39ddb5af7655714 (diff) | |
download | vim-7b167e03a287e40b089c621e4de00ea5446dcac2.tar.gz |
Problem: Skipping over an expression when not evaluating it does not work
properly for dict members.
Solution: Skip over unrecognized expression. (ZyX)
-rw-r--r-- | src/eval.c | 18 | ||||
-rw-r--r-- | src/testdir/test34.in | 13 | ||||
-rw-r--r-- | src/testdir/test34.ok | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 28 insertions, 7 deletions
@@ -19845,24 +19845,30 @@ handle_subscript(arg, rettv, evaluate, verbose) while (ret == OK && (**arg == '[' || (**arg == '.' && rettv->v_type == VAR_DICT) - || (**arg == '(' && rettv->v_type == VAR_FUNC)) + || (**arg == '(' && (!evaluate || rettv->v_type == VAR_FUNC))) && !vim_iswhite(*(*arg - 1))) { if (**arg == '(') { /* need to copy the funcref so that we can clear rettv */ - functv = *rettv; - rettv->v_type = VAR_UNKNOWN; + if (evaluate) + { + functv = *rettv; + rettv->v_type = VAR_UNKNOWN; - /* Invoke the function. Recursive! */ - s = functv.vval.v_string; + /* Invoke the function. Recursive! */ + s = functv.vval.v_string; + } + else + s = (char_u *)""; ret = get_func_tv(s, (int)STRLEN(s), rettv, arg, curwin->w_cursor.lnum, curwin->w_cursor.lnum, &len, evaluate, selfdict); /* Clear the funcref afterwards, so that deleting it while * evaluating the arguments is possible (see test55). */ - clear_tv(&functv); + if (evaluate) + clear_tv(&functv); /* Stop the expression evaluation when immediately aborting on * error, or when an interrupt occurred or an exception was thrown diff --git a/src/testdir/test34.in b/src/testdir/test34.in index 5abc140b..71ee5f63 100644 --- a/src/testdir/test34.in +++ b/src/testdir/test34.in @@ -1,6 +1,7 @@ Test for user functions. Also test an <expr> mapping calling a function. Also test that a builtin function cannot be replaced. +Also test for regression when calling arbitrary expression. STARTTEST :so small.vim @@ -62,7 +63,17 @@ XX+-XX [(one again:call append(line('$'), max([1, 2, 3])) :call extend(g:, {'max': function('min')}) :call append(line('$'), max([1, 2, 3])) -:$-7,$w! test.out +:try +: " Regression: the first line below used to throw ?E110: Missing ')'? +: " Second is here just to prove that this line is correct when not skipping +: " rhs of &&. +: $put =(0&&(function('tr'))(1, 2, 3)) +: $put =(1&&(function('tr'))(1, 2, 3)) +:catch +: $put ='!!! Unexpected exception:' +: $put =v:exception +:endtry +:$-9,$w! test.out :delfunc Table :delfunc Compute :delfunc Expr1 diff --git a/src/testdir/test34.ok b/src/testdir/test34.ok index 60538122..97995de8 100644 --- a/src/testdir/test34.ok +++ b/src/testdir/test34.ok @@ -6,3 +6,5 @@ XX111-XX 1. one again 3 3 +0 +1 diff --git a/src/version.c b/src/version.c index af31b475..f4555c72 100644 --- a/src/version.c +++ b/src/version.c @@ -739,6 +739,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 86, +/**/ 85, /**/ 84, |