diff options
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 5c8f90c490..a6becb4765 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -4186,7 +4186,7 @@ static int eval_lambda(char_u **const arg, typval_T *const rettv, typval_T base = *rettv; rettv->v_type = VAR_UNKNOWN; - const int ret = get_lambda_tv(arg, rettv, evaluate); + int ret = get_lambda_tv(arg, rettv, evaluate); if (ret == NOTDONE) { return FAIL; } else if (**arg != '(') { @@ -4198,9 +4198,18 @@ static int eval_lambda(char_u **const arg, typval_T *const rettv, } } tv_clear(rettv); - return FAIL; + ret = FAIL; + } else { + ret = call_func_rettv(arg, rettv, evaluate, NULL, &base, NULL); } - return call_func_rettv(arg, rettv, evaluate, NULL, &base, NULL); + + // Clear the funcref afterwards, so that deleting it while + // evaluating the arguments is possible (see test55). + if (evaluate) { + tv_clear(&base); + } + + return ret; } /// Evaluate "->method()". |