@@ -5567,17 +5567,42 @@ ex_call_inner(
55675567 * Returns FAIL or OK.
55685568 */
55695569 static int
5570- ex_defer_inner (char_u * name , char_u * * arg , evalarg_T * evalarg )
5570+ ex_defer_inner (
5571+ char_u * name ,
5572+ char_u * * arg ,
5573+ partial_T * partial ,
5574+ evalarg_T * evalarg )
55715575{
55725576 typval_T argvars [MAX_FUNC_ARGS + 1 ]; // vars for arguments
5577+ int partial_argc = 0 ; // number of partial arguments
55735578 int argcount = 0 ; // number of arguments found
5579+ int r ;
55745580
55755581 if (current_funccal == NULL )
55765582 {
55775583 semsg (_ (e_str_not_inside_function ), "defer" );
55785584 return FAIL ;
55795585 }
5580- if (get_func_arguments (arg , evalarg , FALSE, argvars , & argcount ) == FAIL )
5586+ if (partial != NULL )
5587+ {
5588+ if (partial -> pt_dict != NULL )
5589+ {
5590+ emsg (_ (e_cannot_use_partial_with_dictionary_for_defer ));
5591+ return FAIL ;
5592+ }
5593+ if (partial -> pt_argc > 0 )
5594+ {
5595+ int i ;
5596+
5597+ partial_argc = partial -> pt_argc ;
5598+ for (i = 0 ; i < partial_argc ; ++ i )
5599+ copy_tv (& partial -> pt_argv [i ], & argvars [i ]);
5600+ }
5601+ }
5602+ r = get_func_arguments (arg , evalarg , FALSE,
5603+ argvars + partial_argc , & argcount );
5604+ argcount += partial_argc ;
5605+ if (r == FAIL )
55815606 {
55825607 while (-- argcount >= 0 )
55835608 clear_tv (& argvars [argcount ]);
@@ -5738,7 +5763,7 @@ ex_call(exarg_T *eap)
57385763 if (eap -> cmdidx == CMD_defer )
57395764 {
57405765 arg = startarg ;
5741- failed = ex_defer_inner (name , & arg , & evalarg ) == FAIL ;
5766+ failed = ex_defer_inner (name , & arg , partial , & evalarg ) == FAIL ;
57425767 }
57435768 else
57445769 {
0 commit comments