@@ -270,36 +270,34 @@ may_record_change(
270270 void
271271f_listener_add (typval_T * argvars , typval_T * rettv )
272272{
273- char_u * callback ;
274- partial_T * partial ;
273+ callback_T callback ;
275274 listener_T * lnr ;
276275 buf_T * buf = curbuf ;
277276
278- callback = get_callback (& argvars [0 ], & partial );
279- if (callback == NULL )
277+ callback = get_callback (& argvars [0 ]);
278+ if (callback . cb_name == NULL )
280279 return ;
281280
282281 if (argvars [1 ].v_type != VAR_UNKNOWN )
283282 {
284283 buf = get_buf_arg (& argvars [1 ]);
285284 if (buf == NULL )
285+ {
286+ free_callback (& callback );
286287 return ;
288+ }
287289 }
288290
289291 lnr = ALLOC_CLEAR_ONE (listener_T );
290292 if (lnr == NULL )
291293 {
292- free_callback (callback , partial );
294+ free_callback (& callback );
293295 return ;
294296 }
295297 lnr -> lr_next = buf -> b_listener ;
296298 buf -> b_listener = lnr ;
297299
298- if (partial == NULL )
299- lnr -> lr_callback = vim_strsave (callback );
300- else
301- lnr -> lr_callback = callback ; // pointer into the partial
302- lnr -> lr_partial = partial ;
300+ set_callback (& lnr -> lr_callback , & callback );
303301
304302 lnr -> lr_id = ++ next_listener_id ;
305303 rettv -> vval .v_number = lnr -> lr_id ;
@@ -344,7 +342,7 @@ f_listener_remove(typval_T *argvars, typval_T *rettv UNUSED)
344342 prev -> lr_next = lnr -> lr_next ;
345343 else
346344 buf -> b_listener = lnr -> lr_next ;
347- free_callback (lnr -> lr_callback , lnr -> lr_partial );
345+ free_callback (& lnr -> lr_callback );
348346 vim_free (lnr );
349347 }
350348 prev = lnr ;
@@ -418,8 +416,8 @@ invoke_listeners(buf_T *buf)
418416
419417 for (lnr = buf -> b_listener ; lnr != NULL ; lnr = lnr -> lr_next )
420418 {
421- call_func ( lnr -> lr_callback , -1 , & rettv ,
422- 5 , argv , NULL , 0L , 0L , & dummy , TRUE, lnr -> lr_partial , NULL );
419+ call_callback ( & lnr -> lr_callback , -1 , & rettv ,
420+ 5 , argv , NULL , 0L , 0L , & dummy , TRUE, NULL );
423421 clear_tv (& rettv );
424422 }
425423
0 commit comments