diff src/vim9cmds.c @ 31835:5ce5d78afcc9 v9.0.1250

patch 9.0.1250: cannot use an object method with :defer Commit: https://github.com/vim/vim/commit/8dbab1d8ceb82a0fb693a1b7fcb57a2dfb4de068 Author: Bram Moolenaar <Bram@vim.org> Date: Fri Jan 27 20:14:02 2023 +0000 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)
author Bram Moolenaar <Bram@vim.org>
date Fri, 27 Jan 2023 21:15:03 +0100
parents 53c3df37a2b0
children 7d505d77f6da
line wrap: on
line diff
--- a/src/vim9cmds.c
+++ b/src/vim9cmds.c
@@ -1910,6 +1910,7 @@ compile_defer(char_u *arg_start, cctx_T 
     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 
 	// 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 
     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);