@@ -1728,6 +1728,7 @@ emsg_funcname(char *ermsg, char_u *name)
17281728/*
17291729 * Get function arguments at "*arg" and advance it.
17301730 * Return them in "*argvars[MAX_FUNC_ARGS + 1]" and the count in "argcount".
1731+ * On failure FAIL is returned but the "argvars[argcount]" are still set.
17311732 */
17321733 static int
17331734get_func_arguments (
@@ -5570,33 +5571,58 @@ ex_defer_inner(char_u *name, char_u **arg, evalarg_T *evalarg)
55705571{
55715572 typval_T argvars [MAX_FUNC_ARGS + 1 ]; // vars for arguments
55725573 int argcount = 0 ; // number of arguments found
5573- defer_T * dr ;
5574- int ret = FAIL ;
5575- char_u * saved_name ;
55765574
55775575 if (current_funccal == NULL )
55785576 {
55795577 semsg (_ (e_str_not_inside_function ), "defer" );
55805578 return FAIL ;
55815579 }
55825580 if (get_func_arguments (arg , evalarg , FALSE, argvars , & argcount ) == FAIL )
5583- goto theend ;
5584- saved_name = vim_strsave (name );
5585- if (saved_name == NULL )
5586- goto theend ;
5581+ {
5582+ while (-- argcount >= 0 )
5583+ clear_tv (& argvars [argcount ]);
5584+ return FAIL ;
5585+ }
5586+ return add_defer (name , argcount , argvars );
5587+ }
55875588
5588- if (current_funccal -> fc_defer .ga_itemsize == 0 )
5589- ga_init2 (& current_funccal -> fc_defer , sizeof (defer_T ), 10 );
5590- if (ga_grow (& current_funccal -> fc_defer , 1 ) == FAIL )
5589+ /*
5590+ * Add a deferred call for "name" with arguments "argvars[argcount]".
5591+ * Consumes "argvars[]".
5592+ * Caller must check that in_def_function() returns TRUE or current_funccal is
5593+ * not NULL.
5594+ * Returns OK or FAIL.
5595+ */
5596+ int
5597+ add_defer (char_u * name , int argcount_arg , typval_T * argvars )
5598+ {
5599+ char_u * saved_name = vim_strsave (name );
5600+ int argcount = argcount_arg ;
5601+ defer_T * dr ;
5602+ int ret = FAIL ;
5603+
5604+ if (saved_name == NULL )
55915605 goto theend ;
5592- dr = ((defer_T * )current_funccal -> fc_defer .ga_data )
5593- + current_funccal -> fc_defer .ga_len ++ ;
5594- dr -> dr_name = saved_name ;
5595- dr -> dr_argcount = argcount ;
5596- while (argcount > 0 )
5606+ if (in_def_function ())
5607+ {
5608+ if (add_defer_function (saved_name , argcount , argvars ) == OK )
5609+ argcount = 0 ;
5610+ }
5611+ else
55975612 {
5598- -- argcount ;
5599- dr -> dr_argvars [argcount ] = argvars [argcount ];
5613+ if (current_funccal -> fc_defer .ga_itemsize == 0 )
5614+ ga_init2 (& current_funccal -> fc_defer , sizeof (defer_T ), 10 );
5615+ if (ga_grow (& current_funccal -> fc_defer , 1 ) == FAIL )
5616+ goto theend ;
5617+ dr = ((defer_T * )current_funccal -> fc_defer .ga_data )
5618+ + current_funccal -> fc_defer .ga_len ++ ;
5619+ dr -> dr_name = saved_name ;
5620+ dr -> dr_argcount = argcount ;
5621+ while (argcount > 0 )
5622+ {
5623+ -- argcount ;
5624+ dr -> dr_argvars [argcount ] = argvars [argcount ];
5625+ }
56005626 }
56015627 ret = OK ;
56025628
0 commit comments