0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

patch 9.0.1250: cannot use an object method with :defer

Problem:    Cannot use an object method with :defer. (Ernie Rael)
Solution:   Find the object method and generate code to call it.
            (closes #11886)
This commit is contained in:
Bram Moolenaar
2023-01-27 20:14:02 +00:00
parent 657aea7fc4
commit 8dbab1d8ce
8 changed files with 99 additions and 21 deletions

View File

@@ -1910,6 +1910,7 @@ compile_defer(char_u *arg_start, cctx_T *cctx)
int defer_var_idx;
type_T *type;
int func_idx;
int obj_method = 0;
// Get a funcref for the function name.
// TODO: better way to find the "(".
@@ -1925,8 +1926,15 @@ compile_defer(char_u *arg_start, cctx_T *cctx)
// TODO: better type
generate_PUSHFUNC(cctx, (char_u *)internal_func_name(func_idx),
&t_func_any, FALSE);
else if (compile_expr0(&arg, cctx) == FAIL)
return NULL;
else
{
int typecount = cctx->ctx_type_stack.ga_len;
if (compile_expr0(&arg, cctx) == FAIL)
return NULL;
if (cctx->ctx_type_stack.ga_len >= typecount + 2)
// must have seen "obj.Func", pushed an object and a function
obj_method = 1;
}
*paren = '(';
// check for function type
@@ -1958,7 +1966,7 @@ compile_defer(char_u *arg_start, cctx_T *cctx)
defer_var_idx = get_defer_var_idx(cctx);
if (defer_var_idx == 0)
return NULL;
if (generate_DEFER(cctx, defer_var_idx - 1, argcount) == FAIL)
if (generate_DEFER(cctx, defer_var_idx - 1, obj_method, argcount) == FAIL)
return NULL;
return skipwhite(arg);