0
0
mirror of https://github.com/vim/vim.git synced 2025-09-26 04:04:07 -04:00

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)
This commit is contained in:
Bram Moolenaar
2013-11-11 04:25:53 +01:00
parent 3f75e422be
commit 0f8de8dfb2
4 changed files with 28 additions and 7 deletions

View 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