]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.086 v7.4.086
authorBram Moolenaar <Bram@vim.org>
Mon, 11 Nov 2013 03:25:53 +0000 (04:25 +0100)
committerBram Moolenaar <Bram@vim.org>
Mon, 11 Nov 2013 03:25:53 +0000 (04:25 +0100)
Problem:    Skipping over an expression when not evaluating it does not work
            properly for dict members.
Solution:   Skip over unrecognized expression. (ZyX)

src/eval.c
src/testdir/test34.in
src/testdir/test34.ok
src/version.c

index 9fbef244cd60b0b27d2a77fe5c0238d55685cae8..5d8c7c8a2a8942678ed89e03a69c44ef9428a69e 100644 (file)
@@ -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
index 5abc140be0dedadd2c8e739f435c118768ddd27a..71ee5f63b2c9afca58bae8e16d784608090b9304 100644 (file)
@@ -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\e: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
index 605381227422a161f2e088740948eb717b0c7b11..97995de80e821194f0f8074dbfd193ed9c07038d 100644 (file)
@@ -6,3 +6,5 @@ XX111-XX
 1. one again
 3
 3
+0
+1
index af31b4752be203247ab66b3d33de181fa505c1ec..f4555c7261c97b1a019764c7c425f89854eb443f 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    86,
 /**/
     85,
 /**/