Mercurial > vim
changeset 5473:60a5b7b82016 v7.4.086
updated for version 7.4.086
Problem: Skipping over an expression when not evaluating it does not work
properly for dict members.
Solution: Skip over unrecognized expression. (ZyX)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Mon, 11 Nov 2013 04:25:53 +0100 |
parents | 3f4e943e122a |
children | f6940759212d |
files | src/eval.c src/testdir/test34.in src/testdir/test34.ok src/version.c |
diffstat | 4 files changed, 29 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -19845,24 +19845,30 @@ handle_subscript(arg, rettv, evaluate, v 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; - - /* Invoke the function. Recursive! */ - s = functv.vval.v_string; + if (evaluate) + { + functv = *rettv; + rettv->v_type = VAR_UNKNOWN; + + /* 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
--- 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