comparison src/change.c @ 16872:a836d122231a v8.1.1437

patch 8.1.1437: code to handle callbacks is duplicated commit https://github.com/vim/vim/commit/3a97bb3f0f8bd118ae23f1c97e55d84ff42eef20 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Jun 1 13:28:35 2019 +0200 patch 8.1.1437: code to handle callbacks is duplicated Problem: Code to handle callbacks is duplicated. Solution: Add callback_T and functions to deal with it.
author Bram Moolenaar <Bram@vim.org>
date Sat, 01 Jun 2019 13:30:07 +0200
parents 7cade95272c4
children 5493e31010e1
comparison
equal deleted inserted replaced
16871:e5dab34ded73 16872:a836d122231a
268 * listener_add() function 268 * listener_add() function
269 */ 269 */
270 void 270 void
271 f_listener_add(typval_T *argvars, typval_T *rettv) 271 f_listener_add(typval_T *argvars, typval_T *rettv)
272 { 272 {
273 char_u *callback; 273 callback_T callback;
274 partial_T *partial;
275 listener_T *lnr; 274 listener_T *lnr;
276 buf_T *buf = curbuf; 275 buf_T *buf = curbuf;
277 276
278 callback = get_callback(&argvars[0], &partial); 277 callback = get_callback(&argvars[0]);
279 if (callback == NULL) 278 if (callback.cb_name == NULL)
280 return; 279 return;
281 280
282 if (argvars[1].v_type != VAR_UNKNOWN) 281 if (argvars[1].v_type != VAR_UNKNOWN)
283 { 282 {
284 buf = get_buf_arg(&argvars[1]); 283 buf = get_buf_arg(&argvars[1]);
285 if (buf == NULL) 284 if (buf == NULL)
285 {
286 free_callback(&callback);
286 return; 287 return;
288 }
287 } 289 }
288 290
289 lnr = ALLOC_CLEAR_ONE(listener_T); 291 lnr = ALLOC_CLEAR_ONE(listener_T);
290 if (lnr == NULL) 292 if (lnr == NULL)
291 { 293 {
292 free_callback(callback, partial); 294 free_callback(&callback);
293 return; 295 return;
294 } 296 }
295 lnr->lr_next = buf->b_listener; 297 lnr->lr_next = buf->b_listener;
296 buf->b_listener = lnr; 298 buf->b_listener = lnr;
297 299
298 if (partial == NULL) 300 set_callback(&lnr->lr_callback, &callback);
299 lnr->lr_callback = vim_strsave(callback);
300 else
301 lnr->lr_callback = callback; // pointer into the partial
302 lnr->lr_partial = partial;
303 301
304 lnr->lr_id = ++next_listener_id; 302 lnr->lr_id = ++next_listener_id;
305 rettv->vval.v_number = lnr->lr_id; 303 rettv->vval.v_number = lnr->lr_id;
306 } 304 }
307 305
342 { 340 {
343 if (prev != NULL) 341 if (prev != NULL)
344 prev->lr_next = lnr->lr_next; 342 prev->lr_next = lnr->lr_next;
345 else 343 else
346 buf->b_listener = lnr->lr_next; 344 buf->b_listener = lnr->lr_next;
347 free_callback(lnr->lr_callback, lnr->lr_partial); 345 free_callback(&lnr->lr_callback);
348 vim_free(lnr); 346 vim_free(lnr);
349 } 347 }
350 prev = lnr; 348 prev = lnr;
351 } 349 }
352 } 350 }
416 argv[4].vval.v_list = buf->b_recorded_changes; 414 argv[4].vval.v_list = buf->b_recorded_changes;
417 ++textlock; 415 ++textlock;
418 416
419 for (lnr = buf->b_listener; lnr != NULL; lnr = lnr->lr_next) 417 for (lnr = buf->b_listener; lnr != NULL; lnr = lnr->lr_next)
420 { 418 {
421 call_func(lnr->lr_callback, -1, &rettv, 419 call_callback(&lnr->lr_callback, -1, &rettv,
422 5, argv, NULL, 0L, 0L, &dummy, TRUE, lnr->lr_partial, NULL); 420 5, argv, NULL, 0L, 0L, &dummy, TRUE, NULL);
423 clear_tv(&rettv); 421 clear_tv(&rettv);
424 } 422 }
425 423
426 --textlock; 424 --textlock;
427 list_unref(buf->b_recorded_changes); 425 list_unref(buf->b_recorded_changes);