Patch 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)
Files:      src/eval.c, src/testdir/test34.in, src/testdir/test34.ok


*** ../vim-7.4.085/src/eval.c   2013-11-08 04:30:06.000000000 +0100
--- src/eval.c  2013-11-11 04:11:38.000000000 +0100
***************
*** 19845,19868 ****
      while (ret == OK
            && (**arg == '['
                || (**arg == '.' && rettv->v_type == VAR_DICT)
!               || (**arg == '(' && 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;
            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);
  
            /* Stop the expression evaluation when immediately aborting on
             * error, or when an interrupt occurred or an exception was thrown
--- 19845,19874 ----
      while (ret == OK
            && (**arg == '['
                || (**arg == '.' && rettv->v_type == VAR_DICT)
!               || (**arg == '(' && (!evaluate || rettv->v_type == VAR_FUNC)))
            && !vim_iswhite(*(*arg - 1)))
      {
        if (**arg == '(')
        {
            /* need to copy the funcref so that we can clear rettv */
!           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). */
!           if (evaluate)
!               clear_tv(&functv);
  
            /* Stop the expression evaluation when immediately aborting on
             * error, or when an interrupt occurred or an exception was thrown
*** ../vim-7.4.085/src/testdir/test34.in        2012-07-16 16:51:29.000000000 
+0200
--- src/testdir/test34.in       2013-11-11 04:10:13.000000000 +0100
***************
*** 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,68 ****
  [(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
  :delfunc Table
  :delfunc Compute
  :delfunc Expr1
--- 63,79 ----
  [(one again :call append(line('$'), max([1, 2, 3]))
  :call extend(g:, {'max': function('min')})
  :call append(line('$'), max([1, 2, 3]))
! :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
*** ../vim-7.4.085/src/testdir/test34.ok        2012-07-16 16:43:15.000000000 
+0200
--- src/testdir/test34.ok       2013-11-11 04:10:13.000000000 +0100
***************
*** 6,8 ****
--- 6,10 ----
  1. one again
  3
  3
+ 0
+ 1
*** ../vim-7.4.085/src/version.c        2013-11-11 01:29:16.000000000 +0100
--- src/version.c       2013-11-11 04:15:59.000000000 +0100
***************
*** 740,741 ****
--- 740,743 ----
  {   /* Add new patch number below this line */
+ /**/
+     86,
  /**/

-- 
ARTHUR: The swallow may fly south with the sun, or the house martin or the
        plover seek warmer hot lands in winter, yet these are not strangers to
        our land.
SOLDIER: Are you suggesting coconuts migrate?
                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Raspunde prin e-mail lui