fix(eval_lambda): cherry-pick leak fix from v8.1.2107

That patch also includes a test using test_refcount() for lambdas, but
such test functions are N/A for Nvim.
This commit is contained in:
Sean Dewar
2021-08-07 00:48:05 +01:00
parent 5d88349817
commit 5503d8e28b
2 changed files with 17 additions and 3 deletions

View File

@@ -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()".

View File

@@ -145,6 +145,11 @@ func Test_method_lambda()
" todo: lambda accepts more arguments than it consumes
" call assert_fails('eval "text"->{x -> x .. " extended"}("more")', 'E99:')
" Nvim doesn't include test_refcount().
" let l = [1, 2, 3]
" eval l->{x -> x}()
" call assert_equal(1, test_refcount(l))
endfunc
func Test_method_not_supported()