To: vim_dev@googlegroups.com
Subject: Patch 7.4.086
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
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 -- Bram@Moolenaar.net -- 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 ///