diff options
Diffstat (limited to 'data/vim/patches/8.1.1437')
-rw-r--r-- | data/vim/patches/8.1.1437 | 1880 |
1 files changed, 0 insertions, 1880 deletions
diff --git a/data/vim/patches/8.1.1437 b/data/vim/patches/8.1.1437 deleted file mode 100644 index 364f4efc2..000000000 --- a/data/vim/patches/8.1.1437 +++ /dev/null @@ -1,1880 +0,0 @@ -To: vim_dev@googlegroups.com -Subject: Patch 8.1.1437 -Fcc: outbox -From: Bram Moolenaar <Bram@moolenaar.net> -Mime-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit ------------- - -Patch 8.1.1437 -Problem: Code to handle callbacks is duplicated. -Solution: Add callback_T and functions to deal with it. -Files: src/structs.h, src/evalfunc.c, src/proto/evalfunc.pro, - src/change.c, src/channel.c, src/proto/channel.pro, src/buffer.c, - src/userfunc.c, src/proto/userfunc.pro, src/eval.c, - src/ex_cmds2.c, src/popupwin.c - - -*** ../vim-8.1.1436/src/structs.h 2019-05-30 21:24:22.177201251 +0200 ---- src/structs.h 2019-06-01 13:00:39.892747290 +0200 -*************** -*** 1237,1242 **** ---- 1237,1253 ---- - typedef struct partial_S partial_T; - typedef struct blobvar_S blob_T; - -+ // Struct that holds both a normal function name and a partial_T, as used for a -+ // callback argument. -+ // When used temporarily "cb_name" is not allocated. The refcounts to either -+ // the function or the partial are incremented and need to be decremented -+ // later with free_callback(). -+ typedef struct { -+ char_u *cb_name; -+ partial_T *cb_partial; -+ int cb_free_name; // cb_name was allocated -+ } callback_T; -+ - typedef struct jobvar_S job_T; - typedef struct readq_S readq_T; - typedef struct writeq_S writeq_T; -*************** -*** 1566,1573 **** - char_u *jv_tty_type; // allocated - #endif - int jv_exitval; -! char_u *jv_exit_cb; /* allocated */ -! partial_T *jv_exit_partial; - - buf_T *jv_in_buf; /* buffer from "in-name" */ - ---- 1577,1583 ---- - char_u *jv_tty_type; // allocated - #endif - int jv_exitval; -! callback_T jv_exit_cb; - - buf_T *jv_in_buf; /* buffer from "in-name" */ - -*************** -*** 1606,1613 **** - - struct cbq_S - { -! char_u *cq_callback; -! partial_T *cq_partial; - int cq_seq_nr; - cbq_T *cq_next; - cbq_T *cq_prev; ---- 1616,1622 ---- - - struct cbq_S - { -! callback_T cq_callback; - int cq_seq_nr; - cbq_T *cq_next; - cbq_T *cq_prev; -*************** -*** 1689,1696 **** - writeq_T ch_writeque; /* header for write queue */ - - cbq_T ch_cb_head; /* dummy node for per-request callbacks */ -! char_u *ch_callback; /* call when a msg is not handled */ -! partial_T *ch_partial; - - bufref_T ch_bufref; /* buffer to read from or write to */ - int ch_nomodifiable; /* TRUE when buffer can be 'nomodifiable' */ ---- 1698,1704 ---- - writeq_T ch_writeque; /* header for write queue */ - - cbq_T ch_cb_head; /* dummy node for per-request callbacks */ -! callback_T ch_callback; /* call when a msg is not handled */ - - bufref_T ch_bufref; /* buffer to read from or write to */ - int ch_nomodifiable; /* TRUE when buffer can be 'nomodifiable' */ -*************** -*** 1731,1740 **** - #ifdef MSWIN - int ch_named_pipe; /* using named pipe instead of pty */ - #endif -! char_u *ch_callback; /* call when any msg is not handled */ -! partial_T *ch_partial; -! char_u *ch_close_cb; /* call when channel is closed */ -! partial_T *ch_close_partial; - int ch_drop_never; - int ch_keep_open; /* do not close on read error */ - int ch_nonblock; ---- 1739,1746 ---- - #ifdef MSWIN - int ch_named_pipe; /* using named pipe instead of pty */ - #endif -! callback_T ch_callback; /* call when any msg is not handled */ -! callback_T ch_close_cb; /* call when channel is closed */ - int ch_drop_never; - int ch_keep_open; /* do not close on read error */ - int ch_nonblock; -*************** -*** 1833,1848 **** - linenr_T jo_in_top; - linenr_T jo_in_bot; - -! char_u *jo_callback; /* not allocated! */ -! partial_T *jo_partial; /* not referenced! */ -! char_u *jo_out_cb; /* not allocated! */ -! partial_T *jo_out_partial; /* not referenced! */ -! char_u *jo_err_cb; /* not allocated! */ -! partial_T *jo_err_partial; /* not referenced! */ -! char_u *jo_close_cb; /* not allocated! */ -! partial_T *jo_close_partial; /* not referenced! */ -! char_u *jo_exit_cb; /* not allocated! */ -! partial_T *jo_exit_partial; /* not referenced! */ - int jo_drop_never; - int jo_waittime; - int jo_timeout; ---- 1839,1849 ---- - linenr_T jo_in_top; - linenr_T jo_in_bot; - -! callback_T jo_callback; -! callback_T jo_out_cb; -! callback_T jo_err_cb; -! callback_T jo_close_cb; -! callback_T jo_exit_cb; - int jo_drop_never; - int jo_waittime; - int jo_timeout; -*************** -*** 1886,1893 **** - { - listener_T *lr_next; - int lr_id; -! char_u *lr_callback; -! partial_T *lr_partial; - }; - #endif - ---- 1887,1893 ---- - { - listener_T *lr_next; - int lr_id; -! callback_T lr_callback; - }; - #endif - -*************** -*** 1950,1962 **** - #ifdef FEAT_TIMERS - timer_T *tr_next; - timer_T *tr_prev; -! proftime_T tr_due; /* when the callback is to be invoked */ -! char tr_firing; /* when TRUE callback is being called */ -! char tr_paused; /* when TRUE callback is not invoked */ -! int tr_repeat; /* number of times to repeat, -1 forever */ -! long tr_interval; /* msec */ -! char_u *tr_callback; /* allocated */ -! partial_T *tr_partial; - int tr_emsg_count; - #endif - }; ---- 1950,1961 ---- - #ifdef FEAT_TIMERS - timer_T *tr_next; - timer_T *tr_prev; -! proftime_T tr_due; // when the callback is to be invoked -! char tr_firing; // when TRUE callback is being called -! char tr_paused; // when TRUE callback is not invoked -! int tr_repeat; // number of times to repeat, -1 forever -! long tr_interval; // msec -! callback_T tr_callback; - int tr_emsg_count; - #endif - }; -*************** -*** 2509,2521 **** - int b_shortname; /* this file has an 8.3 file name */ - - #ifdef FEAT_JOB_CHANNEL -! char_u *b_prompt_text; // set by prompt_setprompt() -! char_u *b_prompt_callback; // set by prompt_setcallback() -! partial_T *b_prompt_partial; // set by prompt_setcallback() -! char_u *b_prompt_interrupt; // set by prompt_setinterrupt() -! partial_T *b_prompt_int_partial; // set by prompt_setinterrupt() -! int b_prompt_insert; // value for restart_edit when entering -! // a prompt buffer window. - #endif - #ifdef FEAT_MZSCHEME - void *b_mzscheme_ref; /* The MzScheme reference to this buffer */ ---- 2508,2518 ---- - int b_shortname; /* this file has an 8.3 file name */ - - #ifdef FEAT_JOB_CHANNEL -! char_u *b_prompt_text; // set by prompt_setprompt() -! callback_T b_prompt_callback; // set by prompt_setcallback() -! callback_T b_prompt_interrupt; // set by prompt_setinterrupt() -! int b_prompt_insert; // value for restart_edit when entering -! // a prompt buffer window. - #endif - #ifdef FEAT_MZSCHEME - void *b_mzscheme_ref; /* The MzScheme reference to this buffer */ -*** ../vim-8.1.1436/src/evalfunc.c 2019-05-30 22:35:15.151191862 +0200 ---- src/evalfunc.c 2019-06-01 13:13:24.669729965 +0200 -*************** -*** 9200,9207 **** - f_prompt_setcallback(typval_T *argvars, typval_T *rettv UNUSED) - { - buf_T *buf; -! char_u *callback; -! partial_T *partial; - - if (check_secure()) - return; ---- 9200,9206 ---- - f_prompt_setcallback(typval_T *argvars, typval_T *rettv UNUSED) - { - buf_T *buf; -! callback_T callback; - - if (check_secure()) - return; -*************** -*** 9209,9225 **** - if (buf == NULL) - return; - -! callback = get_callback(&argvars[1], &partial); -! if (callback == NULL) - return; - -! free_callback(buf->b_prompt_callback, buf->b_prompt_partial); -! if (partial == NULL) -! buf->b_prompt_callback = vim_strsave(callback); -! else -! /* pointer into the partial */ -! buf->b_prompt_callback = callback; -! buf->b_prompt_partial = partial; - } - - /* ---- 9208,9219 ---- - if (buf == NULL) - return; - -! callback = get_callback(&argvars[1]); -! if (callback.cb_name == NULL) - return; - -! free_callback(&buf->b_prompt_callback); -! set_callback(&buf->b_prompt_callback, &callback); - } - - /* -*************** -*** 9229,9236 **** - f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv UNUSED) - { - buf_T *buf; -! char_u *callback; -! partial_T *partial; - - if (check_secure()) - return; ---- 9223,9229 ---- - f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv UNUSED) - { - buf_T *buf; -! callback_T callback; - - if (check_secure()) - return; -*************** -*** 9238,9254 **** - if (buf == NULL) - return; - -! callback = get_callback(&argvars[1], &partial); -! if (callback == NULL) - return; - -! free_callback(buf->b_prompt_interrupt, buf->b_prompt_int_partial); -! if (partial == NULL) -! buf->b_prompt_interrupt = vim_strsave(callback); -! else -! /* pointer into the partial */ -! buf->b_prompt_interrupt = callback; -! buf->b_prompt_int_partial = partial; - } - - /* ---- 9231,9242 ---- - if (buf == NULL) - return; - -! callback = get_callback(&argvars[1]); -! if (callback.cb_name == NULL) - return; - -! free_callback(&buf->b_prompt_interrupt); -! set_callback(&buf->b_prompt_interrupt, &callback); - } - - /* -*************** -*** 14631,14674 **** - /* - * Get a callback from "arg". It can be a Funcref or a function name. - * When "arg" is zero return an empty string. -! * Return NULL for an invalid argument. - */ -! char_u * -! get_callback(typval_T *arg, partial_T **pp) - { - if (arg->v_type == VAR_PARTIAL && arg->vval.v_partial != NULL) - { -! *pp = arg->vval.v_partial; -! ++(*pp)->pt_refcount; -! return partial_name(*pp); - } -! *pp = NULL; -! if (arg->v_type == VAR_FUNC || arg->v_type == VAR_STRING) - { -! func_ref(arg->vval.v_string); -! return arg->vval.v_string; - } -! if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0) -! return (char_u *)""; -! emsg(_("E921: Invalid callback argument")); -! return NULL; - } - - /* -! * Unref/free "callback" and "partial" returned by get_callback(). - */ - void -! free_callback(char_u *callback, partial_T *partial) - { -! if (partial != NULL) -! partial_unref(partial); -! else if (callback != NULL) - { -! func_unref(callback); -! vim_free(callback); - } - } - - #ifdef FEAT_TIMERS - /* - * "timer_info([timer])" function ---- 14619,14724 ---- - /* - * Get a callback from "arg". It can be a Funcref or a function name. - * When "arg" is zero return an empty string. -! * "cb_name" is not allocated. -! * "cb_name" is set to NULL for an invalid argument. - */ -! callback_T -! get_callback(typval_T *arg) - { -+ callback_T res; -+ -+ res.cb_free_name = FALSE; - if (arg->v_type == VAR_PARTIAL && arg->vval.v_partial != NULL) - { -! res.cb_partial = arg->vval.v_partial; -! ++res.cb_partial->pt_refcount; -! res.cb_name = partial_name(res.cb_partial); - } -! else - { -! res.cb_partial = NULL; -! if (arg->v_type == VAR_FUNC || arg->v_type == VAR_STRING) -! { -! // Note that we don't make a copy of the string. -! res.cb_name = arg->vval.v_string; -! func_ref(res.cb_name); -! } -! else if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0) -! { -! res.cb_name = (char_u *)""; -! } -! else -! { -! emsg(_("E921: Invalid callback argument")); -! res.cb_name = NULL; -! } - } -! return res; - } - - /* -! * Copy a callback into a typval_T. - */ - void -! put_callback(callback_T *cb, typval_T *tv) - { -! if (cb->cb_partial != NULL) -! { -! tv->v_type = VAR_PARTIAL; -! tv->vval.v_partial = cb->cb_partial; -! ++tv->vval.v_partial->pt_refcount; -! } -! else - { -! tv->v_type = VAR_FUNC; -! tv->vval.v_string = vim_strsave(cb->cb_name); -! func_ref(cb->cb_name); - } - } - -+ /* -+ * Make a copy of "src" into "dest", allocating the function name if needed, -+ * without incrementing the refcount. -+ */ -+ void -+ set_callback(callback_T *dest, callback_T *src) -+ { -+ if (src->cb_partial == NULL) -+ { -+ // just a function name, make a copy -+ dest->cb_name = vim_strsave(src->cb_name); -+ dest->cb_free_name = TRUE; -+ } -+ else -+ { -+ // cb_name is a pointer into cb_partial -+ dest->cb_name = src->cb_name; -+ dest->cb_free_name = FALSE; -+ } -+ dest->cb_partial = src->cb_partial; -+ } -+ -+ /* -+ * Unref/free "callback" returned by get_callback() or set_callback(). -+ */ -+ void -+ free_callback(callback_T *callback) -+ { -+ if (callback->cb_partial != NULL) -+ { -+ partial_unref(callback->cb_partial); -+ callback->cb_partial = NULL; -+ } -+ else if (callback->cb_name != NULL) -+ func_unref(callback->cb_name); -+ if (callback->cb_free_name) -+ { -+ vim_free(callback->cb_name); -+ callback->cb_free_name = FALSE; -+ } -+ callback->cb_name = NULL; -+ } -+ - #ifdef FEAT_TIMERS - /* - * "timer_info([timer])" function -*************** -*** 14723,14731 **** - long msec = (long)tv_get_number(&argvars[0]); - timer_T *timer; - int repeat = 0; -! char_u *callback; - dict_T *dict; -- partial_T *partial; - - rettv->vval.v_number = -1; - if (check_secure()) ---- 14773,14780 ---- - long msec = (long)tv_get_number(&argvars[0]); - timer_T *timer; - int repeat = 0; -! callback_T callback; - dict_T *dict; - - rettv->vval.v_number = -1; - if (check_secure()) -*************** -*** 14742,14762 **** - repeat = dict_get_number(dict, (char_u *)"repeat"); - } - -! callback = get_callback(&argvars[1], &partial); -! if (callback == NULL) - return; - - timer = create_timer(msec, repeat); - if (timer == NULL) -! free_callback(callback, partial); - else - { -! if (partial == NULL) -! timer->tr_callback = vim_strsave(callback); -! else -! /* pointer into the partial */ -! timer->tr_callback = callback; -! timer->tr_partial = partial; - rettv->vval.v_number = (varnumber_T)timer->tr_id; - } - } ---- 14791,14806 ---- - repeat = dict_get_number(dict, (char_u *)"repeat"); - } - -! callback = get_callback(&argvars[1]); -! if (callback.cb_name == NULL) - return; - - timer = create_timer(msec, repeat); - if (timer == NULL) -! free_callback(&callback); - else - { -! set_callback(&timer->tr_callback, &callback); - rettv->vval.v_number = (varnumber_T)timer->tr_id; - } - } -*** ../vim-8.1.1436/src/proto/evalfunc.pro 2019-05-11 21:14:02.336269566 +0200 ---- src/proto/evalfunc.pro 2019-05-31 23:04:21.602577328 +0200 -*************** -*** 11,16 **** - float_T vim_round(float_T f); - long do_searchpair(char_u *spat, char_u *mpat, char_u *epat, int dir, typval_T *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit); - void f_string(typval_T *argvars, typval_T *rettv); -! char_u *get_callback(typval_T *arg, partial_T **pp); -! void free_callback(char_u *callback, partial_T *partial); - /* vim: set ft=c : */ ---- 11,18 ---- - float_T vim_round(float_T f); - long do_searchpair(char_u *spat, char_u *mpat, char_u *epat, int dir, typval_T *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit); - void f_string(typval_T *argvars, typval_T *rettv); -! callback_T get_callback(typval_T *arg); -! void put_callback(callback_T *cb, typval_T *tv); -! void set_callback(callback_T *dest, callback_T *src); -! void free_callback(callback_T *callback); - /* vim: set ft=c : */ -*** ../vim-8.1.1436/src/change.c 2019-05-29 22:28:25.759184826 +0200 ---- src/change.c 2019-05-31 22:55:13.929346887 +0200 -*************** -*** 270,305 **** - void - f_listener_add(typval_T *argvars, typval_T *rettv) - { -! char_u *callback; -! partial_T *partial; - listener_T *lnr; - buf_T *buf = curbuf; - -! callback = get_callback(&argvars[0], &partial); -! if (callback == NULL) - return; - - if (argvars[1].v_type != VAR_UNKNOWN) - { - buf = get_buf_arg(&argvars[1]); - if (buf == NULL) - return; - } - - lnr = ALLOC_CLEAR_ONE(listener_T); - if (lnr == NULL) - { -! free_callback(callback, partial); - return; - } - lnr->lr_next = buf->b_listener; - buf->b_listener = lnr; - -! if (partial == NULL) -! lnr->lr_callback = vim_strsave(callback); -! else -! lnr->lr_callback = callback; // pointer into the partial -! lnr->lr_partial = partial; - - lnr->lr_id = ++next_listener_id; - rettv->vval.v_number = lnr->lr_id; ---- 270,303 ---- - void - f_listener_add(typval_T *argvars, typval_T *rettv) - { -! callback_T callback; - listener_T *lnr; - buf_T *buf = curbuf; - -! callback = get_callback(&argvars[0]); -! if (callback.cb_name == NULL) - return; - - if (argvars[1].v_type != VAR_UNKNOWN) - { - buf = get_buf_arg(&argvars[1]); - if (buf == NULL) -+ { -+ free_callback(&callback); - return; -+ } - } - - lnr = ALLOC_CLEAR_ONE(listener_T); - if (lnr == NULL) - { -! free_callback(&callback); - return; - } - lnr->lr_next = buf->b_listener; - buf->b_listener = lnr; - -! set_callback(&lnr->lr_callback, &callback); - - lnr->lr_id = ++next_listener_id; - rettv->vval.v_number = lnr->lr_id; -*************** -*** 344,350 **** - prev->lr_next = lnr->lr_next; - else - buf->b_listener = lnr->lr_next; -! free_callback(lnr->lr_callback, lnr->lr_partial); - vim_free(lnr); - } - prev = lnr; ---- 342,348 ---- - prev->lr_next = lnr->lr_next; - else - buf->b_listener = lnr->lr_next; -! free_callback(&lnr->lr_callback); - vim_free(lnr); - } - prev = lnr; -*************** -*** 418,425 **** - - for (lnr = buf->b_listener; lnr != NULL; lnr = lnr->lr_next) - { -! call_func(lnr->lr_callback, -1, &rettv, -! 5, argv, NULL, 0L, 0L, &dummy, TRUE, lnr->lr_partial, NULL); - clear_tv(&rettv); - } - ---- 416,423 ---- - - for (lnr = buf->b_listener; lnr != NULL; lnr = lnr->lr_next) - { -! call_callback(&lnr->lr_callback, -1, &rettv, -! 5, argv, NULL, 0L, 0L, &dummy, TRUE, NULL); - clear_tv(&rettv); - } - -*** ../vim-8.1.1436/src/channel.c 2019-05-28 23:08:12.052648779 +0200 ---- src/channel.c 2019-06-01 12:58:20.873575186 +0200 -*************** -*** 348,354 **** - return FALSE; - - /* If there is a close callback it may still need to be invoked. */ -! if (channel->ch_close_cb != NULL) - return TRUE; - - /* If reading from or a buffer it's still useful. */ ---- 348,354 ---- - return FALSE; - - /* If there is a close callback it may still need to be invoked. */ -! if (channel->ch_close_cb.cb_name != NULL) - return TRUE; - - /* If reading from or a buffer it's still useful. */ -*************** -*** 366,377 **** - has_err_msg = channel->ch_part[PART_ERR].ch_fd != INVALID_FD - || channel->ch_part[PART_ERR].ch_head.rq_next != NULL - || channel->ch_part[PART_ERR].ch_json_head.jq_next != NULL; -! return (channel->ch_callback != NULL && (has_sock_msg - || has_out_msg || has_err_msg)) -! || ((channel->ch_part[PART_OUT].ch_callback != NULL - || channel->ch_part[PART_OUT].ch_bufref.br_buf != NULL) - && has_out_msg) -! || ((channel->ch_part[PART_ERR].ch_callback != NULL - || channel->ch_part[PART_ERR].ch_bufref.br_buf != NULL) - && has_err_msg); - } ---- 366,377 ---- - has_err_msg = channel->ch_part[PART_ERR].ch_fd != INVALID_FD - || channel->ch_part[PART_ERR].ch_head.rq_next != NULL - || channel->ch_part[PART_ERR].ch_json_head.jq_next != NULL; -! return (channel->ch_callback.cb_name != NULL && (has_sock_msg - || has_out_msg || has_err_msg)) -! || ((channel->ch_part[PART_OUT].ch_callback.cb_name != NULL - || channel->ch_part[PART_OUT].ch_bufref.br_buf != NULL) - && has_out_msg) -! || ((channel->ch_part[PART_ERR].ch_callback.cb_name != NULL - || channel->ch_part[PART_ERR].ch_bufref.br_buf != NULL) - && has_err_msg); - } -*************** -*** 1178,1206 **** - return buf; - } - - static void -! set_callback( -! char_u **cbp, -! partial_T **pp, -! char_u *callback, -! partial_T *partial) - { -! free_callback(*cbp, *pp); -! if (callback != NULL && *callback != NUL) - { -! if (partial != NULL) -! *cbp = partial_name(partial); -! else -! { -! *cbp = vim_strsave(callback); -! func_ref(*cbp); -! } - } - else -! *cbp = NULL; -! *pp = partial; -! if (partial != NULL) -! ++partial->pt_refcount; - } - - /* ---- 1178,1213 ---- - return buf; - } - -+ /* -+ * Copy callback from "src" to "dest", incrementing the refcounts. -+ */ - static void -! copy_callback(callback_T *dest, callback_T *src) - { -! dest->cb_partial = src->cb_partial; -! if (dest->cb_partial != NULL) - { -! dest->cb_name = src->cb_name; -! dest->cb_free_name = FALSE; -! ++dest->cb_partial->pt_refcount; -! } -! else -! { -! dest->cb_name = vim_strsave(src->cb_name); -! dest->cb_free_name = TRUE; -! func_ref(src->cb_name); - } -+ } -+ -+ static void -+ free_set_callback(callback_T *cbp, callback_T *callback) -+ { -+ free_callback(cbp); -+ -+ if (callback->cb_name != NULL && *callback->cb_name != NUL) -+ copy_callback(cbp, callback); - else -! cbp->cb_name = NULL; - } - - /* -*************** -*** 1233,1251 **** - channel->ch_part[PART_IN].ch_block_write = 1; - - if (opt->jo_set & JO_CALLBACK) -! set_callback(&channel->ch_callback, &channel->ch_partial, -! opt->jo_callback, opt->jo_partial); - if (opt->jo_set & JO_OUT_CALLBACK) -! set_callback(&channel->ch_part[PART_OUT].ch_callback, -! &channel->ch_part[PART_OUT].ch_partial, -! opt->jo_out_cb, opt->jo_out_partial); - if (opt->jo_set & JO_ERR_CALLBACK) -! set_callback(&channel->ch_part[PART_ERR].ch_callback, -! &channel->ch_part[PART_ERR].ch_partial, -! opt->jo_err_cb, opt->jo_err_partial); - if (opt->jo_set & JO_CLOSE_CALLBACK) -! set_callback(&channel->ch_close_cb, &channel->ch_close_partial, -! opt->jo_close_cb, opt->jo_close_partial); - channel->ch_drop_never = opt->jo_drop_never; - - if ((opt->jo_set & JO_OUT_IO) && opt->jo_io[PART_OUT] == JIO_BUFFER) ---- 1240,1254 ---- - channel->ch_part[PART_IN].ch_block_write = 1; - - if (opt->jo_set & JO_CALLBACK) -! free_set_callback(&channel->ch_callback, &opt->jo_callback); - if (opt->jo_set & JO_OUT_CALLBACK) -! free_set_callback(&channel->ch_part[PART_OUT].ch_callback, -! &opt->jo_out_cb); - if (opt->jo_set & JO_ERR_CALLBACK) -! free_set_callback(&channel->ch_part[PART_ERR].ch_callback, -! &opt->jo_err_cb); - if (opt->jo_set & JO_CLOSE_CALLBACK) -! free_set_callback(&channel->ch_close_cb, &opt->jo_close_cb); - channel->ch_drop_never = opt->jo_drop_never; - - if ((opt->jo_set & JO_OUT_IO) && opt->jo_io[PART_OUT] == JIO_BUFFER) -*************** -*** 1349,1356 **** - channel_set_req_callback( - channel_T *channel, - ch_part_T part, -! char_u *callback, -! partial_T *partial, - int id) - { - cbq_T *head = &channel->ch_part[part].ch_cb_head; ---- 1352,1358 ---- - channel_set_req_callback( - channel_T *channel, - ch_part_T part, -! callback_T *callback, - int id) - { - cbq_T *head = &channel->ch_part[part].ch_cb_head; -*************** -*** 1358,1374 **** - - if (item != NULL) - { -! item->cq_partial = partial; -! if (partial != NULL) -! { -! ++partial->pt_refcount; -! item->cq_callback = callback; -! } -! else -! { -! item->cq_callback = vim_strsave(callback); -! func_ref(item->cq_callback); -! } - item->cq_seq_nr = id; - item->cq_prev = head->cq_prev; - head->cq_prev = item; ---- 1360,1366 ---- - - if (item != NULL) - { -! copy_callback(&item->cq_callback, callback); - item->cq_seq_nr = id; - item->cq_prev = head->cq_prev; - head->cq_prev = item; -*************** -*** 1638,1645 **** - * This does not redraw but sets channel_need_redraw; - */ - static void -! invoke_callback(channel_T *channel, char_u *callback, partial_T *partial, -! typval_T *argv) - { - typval_T rettv; - int dummy; ---- 1630,1636 ---- - * This does not redraw but sets channel_need_redraw; - */ - static void -! invoke_callback(channel_T *channel, callback_T *callback, typval_T *argv) - { - typval_T rettv; - int dummy; -*************** -*** 1650,1657 **** - argv[0].v_type = VAR_CHANNEL; - argv[0].vval.v_channel = channel; - -! call_func(callback, -1, &rettv, 2, argv, NULL, -! 0L, 0L, &dummy, TRUE, partial, NULL); - clear_tv(&rettv); - channel_need_redraw = TRUE; - } ---- 1641,1648 ---- - argv[0].v_type = VAR_CHANNEL; - argv[0].vval.v_channel = channel; - -! call_callback(callback, -1, &rettv, 2, argv, NULL, -! 0L, 0L, &dummy, TRUE, NULL); - clear_tv(&rettv); - channel_need_redraw = TRUE; - } -*************** -*** 2414,2425 **** - typval_T *argv) - { - ch_log(channel, "Invoking one-time callback %s", -! (char *)item->cq_callback); - /* Remove the item from the list first, if the callback - * invokes ch_close() the list will be cleared. */ - remove_cb_node(cbhead, item); -! invoke_callback(channel, item->cq_callback, item->cq_partial, argv); -! free_callback(item->cq_callback, item->cq_partial); - vim_free(item); - } - ---- 2405,2416 ---- - typval_T *argv) - { - ch_log(channel, "Invoking one-time callback %s", -! (char *)item->cq_callback.cb_name); - /* Remove the item from the list first, if the callback - * invokes ch_close() the list will be cleared. */ - remove_cb_node(cbhead, item); -! invoke_callback(channel, &item->cq_callback, argv); -! free_callback(&item->cq_callback); - vim_free(item); - } - -*************** -*** 2553,2560 **** - ch_mode_T ch_mode = ch_part->ch_mode; - cbq_T *cbhead = &ch_part->ch_cb_head; - cbq_T *cbitem; -! char_u *callback = NULL; -! partial_T *partial = NULL; - buf_T *buffer = NULL; - char_u *p; - ---- 2544,2550 ---- - ch_mode_T ch_mode = ch_part->ch_mode; - cbq_T *cbhead = &ch_part->ch_cb_head; - cbq_T *cbitem; -! callback_T *callback = NULL; - buf_T *buffer = NULL; - char_u *p; - -*************** -*** 2567,2586 **** - if (cbitem->cq_seq_nr == 0) - break; - if (cbitem != NULL) -! { -! callback = cbitem->cq_callback; -! partial = cbitem->cq_partial; -! } -! else if (ch_part->ch_callback != NULL) -! { -! callback = ch_part->ch_callback; -! partial = ch_part->ch_partial; -! } -! else -! { -! callback = channel->ch_callback; -! partial = channel->ch_partial; -! } - - buffer = ch_part->ch_bufref.br_buf; - if (buffer != NULL && (!bufref_valid(&ch_part->ch_bufref) ---- 2557,2567 ---- - if (cbitem->cq_seq_nr == 0) - break; - if (cbitem != NULL) -! callback = &cbitem->cq_callback; -! else if (ch_part->ch_callback.cb_name != NULL) -! callback = &ch_part->ch_callback; -! else if (channel->ch_callback.cb_name != NULL) -! callback = &channel->ch_callback; - - buffer = ch_part->ch_bufref.br_buf; - if (buffer != NULL && (!bufref_valid(&ch_part->ch_bufref) -*************** -*** 2642,2648 **** - { - /* If there is a close callback it may use ch_read() to get the - * messages. */ -! if (channel->ch_close_cb == NULL && !channel->ch_drop_never) - drop_messages(channel, part); - return FALSE; - } ---- 2623,2629 ---- - { - /* If there is a close callback it may use ch_read() to get the - * messages. */ -! if (channel->ch_close_cb.cb_name == NULL && !channel->ch_drop_never) - drop_messages(channel, part); - return FALSE; - } -*************** -*** 2761,2768 **** - { - /* invoke the channel callback */ - ch_log(channel, "Invoking channel callback %s", -! (char *)callback); -! invoke_callback(channel, callback, partial, argv); - } - } - } ---- 2742,2749 ---- - { - /* invoke the channel callback */ - ch_log(channel, "Invoking channel callback %s", -! (char *)callback->cb_name); -! invoke_callback(channel, callback, argv); - } - } - } -*************** -*** 2956,2973 **** - ch_part_T part; - - /* Invoke callbacks and flush buffers before the close callback. */ -! if (channel->ch_close_cb != NULL) - ch_log(channel, - "Invoking callbacks and flushing buffers before closing"); - for (part = PART_SOCK; part < PART_IN; ++part) - { -! if (channel->ch_close_cb != NULL - || channel->ch_part[part].ch_bufref.br_buf != NULL) - { - /* Increment the refcount to avoid the channel being freed - * halfway. */ - ++channel->ch_refcount; -! if (channel->ch_close_cb == NULL) - ch_log(channel, "flushing %s buffers before closing", - part_names[part]); - while (may_invoke_callback(channel, part)) ---- 2937,2954 ---- - ch_part_T part; - - /* Invoke callbacks and flush buffers before the close callback. */ -! if (channel->ch_close_cb.cb_name != NULL) - ch_log(channel, - "Invoking callbacks and flushing buffers before closing"); - for (part = PART_SOCK; part < PART_IN; ++part) - { -! if (channel->ch_close_cb.cb_name != NULL - || channel->ch_part[part].ch_bufref.br_buf != NULL) - { - /* Increment the refcount to avoid the channel being freed - * halfway. */ - ++channel->ch_refcount; -! if (channel->ch_close_cb.cb_name == NULL) - ch_log(channel, "flushing %s buffers before closing", - part_names[part]); - while (may_invoke_callback(channel, part)) -*************** -*** 2976,2982 **** - } - } - -! if (channel->ch_close_cb != NULL) - { - typval_T argv[1]; - typval_T rettv; ---- 2957,2963 ---- - } - } - -! if (channel->ch_close_cb.cb_name != NULL) - { - typval_T argv[1]; - typval_T rettv; -*************** -*** 2986,3004 **** - * halfway. */ - ++channel->ch_refcount; - ch_log(channel, "Invoking close callback %s", -! (char *)channel->ch_close_cb); - argv[0].v_type = VAR_CHANNEL; - argv[0].vval.v_channel = channel; -! call_func(channel->ch_close_cb, -1, -! &rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE, -! channel->ch_close_partial, NULL); - clear_tv(&rettv); - channel_need_redraw = TRUE; - - /* the callback is only called once */ -! free_callback(channel->ch_close_cb, channel->ch_close_partial); -! channel->ch_close_cb = NULL; -! channel->ch_close_partial = NULL; - - if (channel_need_redraw) - { ---- 2967,2982 ---- - * halfway. */ - ++channel->ch_refcount; - ch_log(channel, "Invoking close callback %s", -! (char *)channel->ch_close_cb.cb_name); - argv[0].v_type = VAR_CHANNEL; - argv[0].vval.v_channel = channel; -! call_callback(&channel->ch_close_cb, -1, -! &rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE, NULL); - clear_tv(&rettv); - channel_need_redraw = TRUE; - - /* the callback is only called once */ -! free_callback(&channel->ch_close_cb); - - if (channel_need_redraw) - { -*************** -*** 3061,3067 **** - cbq_T *node = cb_head->cq_next; - - remove_cb_node(cb_head, node); -! free_callback(node->cq_callback, node->cq_partial); - vim_free(node); - } - ---- 3039,3045 ---- - cbq_T *node = cb_head->cq_next; - - remove_cb_node(cb_head, node); -! free_callback(&node->cq_callback); - vim_free(node); - } - -*************** -*** 3071,3079 **** - remove_json_node(json_head, json_head->jq_next); - } - -! free_callback(ch_part->ch_callback, ch_part->ch_partial); -! ch_part->ch_callback = NULL; -! ch_part->ch_partial = NULL; - - while (ch_part->ch_writeque.wq_next != NULL) - remove_from_writeque(&ch_part->ch_writeque, ---- 3049,3055 ---- - remove_json_node(json_head, json_head->jq_next); - } - -! free_callback(&ch_part->ch_callback); - - while (ch_part->ch_writeque.wq_next != NULL) - remove_from_writeque(&ch_part->ch_writeque, -*************** -*** 3092,3103 **** - channel_clear_one(channel, PART_OUT); - channel_clear_one(channel, PART_ERR); - channel_clear_one(channel, PART_IN); -! free_callback(channel->ch_callback, channel->ch_partial); -! channel->ch_callback = NULL; -! channel->ch_partial = NULL; -! free_callback(channel->ch_close_cb, channel->ch_close_partial); -! channel->ch_close_cb = NULL; -! channel->ch_close_partial = NULL; - } - - #if defined(EXITFREE) || defined(PROTO) ---- 3068,3075 ---- - channel_clear_one(channel, PART_OUT); - channel_clear_one(channel, PART_ERR); - channel_clear_one(channel, PART_IN); -! free_callback(&channel->ch_callback); -! free_callback(&channel->ch_close_cb); - } - - #if defined(EXITFREE) || defined(PROTO) -*************** -*** 3991,4009 **** - /* Set the callback. An empty callback means no callback and not reading - * the response. With "ch_evalexpr()" and "ch_evalraw()" a callback is not - * allowed. */ -! if (opt->jo_callback != NULL && *opt->jo_callback != NUL) - { - if (eval) - { - semsg(_("E917: Cannot use a callback with %s()"), fun); - return NULL; - } -! channel_set_req_callback(channel, *part_read, -! opt->jo_callback, opt->jo_partial, id); - } - - if (channel_send(channel, part_send, text, len, fun) == OK -! && opt->jo_callback == NULL) - return channel; - return NULL; - } ---- 3963,3980 ---- - /* Set the callback. An empty callback means no callback and not reading - * the response. With "ch_evalexpr()" and "ch_evalraw()" a callback is not - * allowed. */ -! if (opt->jo_callback.cb_name != NULL && *opt->jo_callback.cb_name != NUL) - { - if (eval) - { - semsg(_("E917: Cannot use a callback with %s()"), fun); - return NULL; - } -! channel_set_req_callback(channel, *part_read, &opt->jo_callback, id); - } - - if (channel_send(channel, part_send, text, len, fun) == OK -! && opt->jo_callback.cb_name == NULL) - return channel; - return NULL; - } -*************** -*** 4559,4584 **** - void - free_job_options(jobopt_T *opt) - { -! if (opt->jo_partial != NULL) -! partial_unref(opt->jo_partial); -! else if (opt->jo_callback != NULL) -! func_unref(opt->jo_callback); -! if (opt->jo_out_partial != NULL) -! partial_unref(opt->jo_out_partial); -! else if (opt->jo_out_cb != NULL) -! func_unref(opt->jo_out_cb); -! if (opt->jo_err_partial != NULL) -! partial_unref(opt->jo_err_partial); -! else if (opt->jo_err_cb != NULL) -! func_unref(opt->jo_err_cb); -! if (opt->jo_close_partial != NULL) -! partial_unref(opt->jo_close_partial); -! else if (opt->jo_close_cb != NULL) -! func_unref(opt->jo_close_cb); -! if (opt->jo_exit_partial != NULL) -! partial_unref(opt->jo_exit_partial); -! else if (opt->jo_exit_cb != NULL) -! func_unref(opt->jo_exit_cb); - if (opt->jo_env != NULL) - dict_unref(opt->jo_env); - } ---- 4530,4555 ---- - void - free_job_options(jobopt_T *opt) - { -! if (opt->jo_callback.cb_partial != NULL) -! partial_unref(opt->jo_callback.cb_partial); -! else if (opt->jo_callback.cb_name != NULL) -! func_unref(opt->jo_callback.cb_name); -! if (opt->jo_out_cb.cb_partial != NULL) -! partial_unref(opt->jo_out_cb.cb_partial); -! else if (opt->jo_out_cb.cb_name != NULL) -! func_unref(opt->jo_out_cb.cb_name); -! if (opt->jo_err_cb.cb_partial != NULL) -! partial_unref(opt->jo_err_cb.cb_partial); -! else if (opt->jo_err_cb.cb_name != NULL) -! func_unref(opt->jo_err_cb.cb_name); -! if (opt->jo_close_cb.cb_partial != NULL) -! partial_unref(opt->jo_close_cb.cb_partial); -! else if (opt->jo_close_cb.cb_name != NULL) -! func_unref(opt->jo_close_cb.cb_name); -! if (opt->jo_exit_cb.cb_partial != NULL) -! partial_unref(opt->jo_exit_cb.cb_partial); -! else if (opt->jo_exit_cb.cb_name != NULL) -! func_unref(opt->jo_exit_cb.cb_name); - if (opt->jo_env != NULL) - dict_unref(opt->jo_env); - } -*************** -*** 4771,4778 **** - if (!(supported & JO_CALLBACK)) - break; - opt->jo_set |= JO_CALLBACK; -! opt->jo_callback = get_callback(item, &opt->jo_partial); -! if (opt->jo_callback == NULL) - { - semsg(_(e_invargval), "callback"); - return FAIL; ---- 4742,4749 ---- - if (!(supported & JO_CALLBACK)) - break; - opt->jo_set |= JO_CALLBACK; -! opt->jo_callback = get_callback(item); -! if (opt->jo_callback.cb_name == NULL) - { - semsg(_(e_invargval), "callback"); - return FAIL; -*************** -*** 4783,4790 **** - if (!(supported & JO_OUT_CALLBACK)) - break; - opt->jo_set |= JO_OUT_CALLBACK; -! opt->jo_out_cb = get_callback(item, &opt->jo_out_partial); -! if (opt->jo_out_cb == NULL) - { - semsg(_(e_invargval), "out_cb"); - return FAIL; ---- 4754,4761 ---- - if (!(supported & JO_OUT_CALLBACK)) - break; - opt->jo_set |= JO_OUT_CALLBACK; -! opt->jo_out_cb = get_callback(item); -! if (opt->jo_out_cb.cb_name == NULL) - { - semsg(_(e_invargval), "out_cb"); - return FAIL; -*************** -*** 4795,4802 **** - if (!(supported & JO_ERR_CALLBACK)) - break; - opt->jo_set |= JO_ERR_CALLBACK; -! opt->jo_err_cb = get_callback(item, &opt->jo_err_partial); -! if (opt->jo_err_cb == NULL) - { - semsg(_(e_invargval), "err_cb"); - return FAIL; ---- 4766,4773 ---- - if (!(supported & JO_ERR_CALLBACK)) - break; - opt->jo_set |= JO_ERR_CALLBACK; -! opt->jo_err_cb = get_callback(item); -! if (opt->jo_err_cb.cb_name == NULL) - { - semsg(_(e_invargval), "err_cb"); - return FAIL; -*************** -*** 4807,4814 **** - if (!(supported & JO_CLOSE_CALLBACK)) - break; - opt->jo_set |= JO_CLOSE_CALLBACK; -! opt->jo_close_cb = get_callback(item, &opt->jo_close_partial); -! if (opt->jo_close_cb == NULL) - { - semsg(_(e_invargval), "close_cb"); - return FAIL; ---- 4778,4785 ---- - if (!(supported & JO_CLOSE_CALLBACK)) - break; - opt->jo_set |= JO_CLOSE_CALLBACK; -! opt->jo_close_cb = get_callback(item); -! if (opt->jo_close_cb.cb_name == NULL) - { - semsg(_(e_invargval), "close_cb"); - return FAIL; -*************** -*** 4833,4840 **** - if (!(supported & JO_EXIT_CB)) - break; - opt->jo_set |= JO_EXIT_CB; -! opt->jo_exit_cb = get_callback(item, &opt->jo_exit_partial); -! if (opt->jo_exit_cb == NULL) - { - semsg(_(e_invargval), "exit_cb"); - return FAIL; ---- 4804,4811 ---- - if (!(supported & JO_EXIT_CB)) - break; - opt->jo_set |= JO_EXIT_CB; -! opt->jo_exit_cb = get_callback(item); -! if (opt->jo_exit_cb.cb_name == NULL) - { - semsg(_(e_invargval), "exit_cb"); - return FAIL; -*************** -*** 5201,5207 **** - #ifdef MSWIN - vim_free(job->jv_tty_type); - #endif -! free_callback(job->jv_exit_cb, job->jv_exit_partial); - if (job->jv_argv != NULL) - { - for (i = 0; job->jv_argv[i] != NULL; i++) ---- 5172,5178 ---- - #ifdef MSWIN - vim_free(job->jv_tty_type); - #endif -! free_callback(&job->jv_exit_cb); - if (job->jv_argv != NULL) - { - for (i = 0; job->jv_argv[i] != NULL; i++) -*************** -*** 5289,5295 **** - job_need_end_check(job_T *job) - { - return job->jv_status == JOB_STARTED -! && (job->jv_stoponexit != NULL || job->jv_exit_cb != NULL); - } - - /* ---- 5260,5266 ---- - job_need_end_check(job_T *job) - { - return job->jv_status == JOB_STARTED -! && (job->jv_stoponexit != NULL || job->jv_exit_cb.cb_name != NULL); - } - - /* -*************** -*** 5465,5486 **** - if (job->jv_channel != NULL) - ch_close_part(job->jv_channel, PART_IN); - -! if (job->jv_exit_cb != NULL) - { - typval_T argv[3]; - typval_T rettv; - int dummy; - - /* Invoke the exit callback. Make sure the refcount is > 0. */ -! ch_log(job->jv_channel, "Invoking exit callback %s", job->jv_exit_cb); - ++job->jv_refcount; - argv[0].v_type = VAR_JOB; - argv[0].vval.v_job = job; - argv[1].v_type = VAR_NUMBER; - argv[1].vval.v_number = job->jv_exitval; -! call_func(job->jv_exit_cb, -1, -! &rettv, 2, argv, NULL, 0L, 0L, &dummy, TRUE, -! job->jv_exit_partial, NULL); - clear_tv(&rettv); - --job->jv_refcount; - channel_need_redraw = TRUE; ---- 5436,5457 ---- - if (job->jv_channel != NULL) - ch_close_part(job->jv_channel, PART_IN); - -! if (job->jv_exit_cb.cb_name != NULL) - { - typval_T argv[3]; - typval_T rettv; - int dummy; - - /* Invoke the exit callback. Make sure the refcount is > 0. */ -! ch_log(job->jv_channel, "Invoking exit callback %s", -! job->jv_exit_cb.cb_name); - ++job->jv_refcount; - argv[0].v_type = VAR_JOB; - argv[0].vval.v_job = job; - argv[1].v_type = VAR_NUMBER; - argv[1].vval.v_number = job->jv_exitval; -! call_callback(&job->jv_exit_cb, -1, -! &rettv, 2, argv, NULL, 0L, 0L, &dummy, TRUE, NULL); - clear_tv(&rettv); - --job->jv_refcount; - channel_need_redraw = TRUE; -*************** -*** 5622,5647 **** - } - if (opt->jo_set & JO_EXIT_CB) - { -! free_callback(job->jv_exit_cb, job->jv_exit_partial); -! if (opt->jo_exit_cb == NULL || *opt->jo_exit_cb == NUL) - { -! job->jv_exit_cb = NULL; -! job->jv_exit_partial = NULL; - } - else -! { -! job->jv_exit_partial = opt->jo_exit_partial; -! if (job->jv_exit_partial != NULL) -! { -! job->jv_exit_cb = opt->jo_exit_cb; -! ++job->jv_exit_partial->pt_refcount; -! } -! else -! { -! job->jv_exit_cb = vim_strsave(opt->jo_exit_cb); -! func_ref(job->jv_exit_cb); -! } -! } - } - } - ---- 5593,5606 ---- - } - if (opt->jo_set & JO_EXIT_CB) - { -! free_callback(&job->jv_exit_cb); -! if (opt->jo_exit_cb.cb_name == NULL || *opt->jo_exit_cb.cb_name == NUL) - { -! job->jv_exit_cb.cb_name = NULL; -! job->jv_exit_cb.cb_partial = NULL; - } - else -! copy_callback(&job->jv_exit_cb, &opt->jo_exit_cb); - } - } - -*************** -*** 5959,5965 **** - dict_add_string(dict, "tty_out", job->jv_tty_out); - - dict_add_number(dict, "exitval", job->jv_exitval); -! dict_add_string(dict, "exit_cb", job->jv_exit_cb); - dict_add_string(dict, "stoponexit", job->jv_stoponexit); - #ifdef UNIX - dict_add_string(dict, "termsig", job->jv_termsig); ---- 5918,5924 ---- - dict_add_string(dict, "tty_out", job->jv_tty_out); - - dict_add_number(dict, "exitval", job->jv_exitval); -! dict_add_string(dict, "exit_cb", job->jv_exit_cb.cb_name); - dict_add_string(dict, "stoponexit", job->jv_stoponexit); - #ifdef UNIX - dict_add_string(dict, "termsig", job->jv_termsig); -*************** -*** 6059,6065 **** - curwin->w_cursor.lnum = lnum + 1; - curwin->w_cursor.col = 0; - -! if (curbuf->b_prompt_callback == NULL || *curbuf->b_prompt_callback == NUL) - return; - text = ml_get(lnum); - prompt = prompt_text(); ---- 6018,6025 ---- - curwin->w_cursor.lnum = lnum + 1; - curwin->w_cursor.col = 0; - -! if (curbuf->b_prompt_callback.cb_name == NULL -! || *curbuf->b_prompt_callback.cb_name == NUL) - return; - text = ml_get(lnum); - prompt = prompt_text(); -*************** -*** 6069,6077 **** - argv[0].vval.v_string = vim_strsave(text); - argv[1].v_type = VAR_UNKNOWN; - -! call_func(curbuf->b_prompt_callback, -1, -! &rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE, -! curbuf->b_prompt_partial, NULL); - clear_tv(&argv[0]); - clear_tv(&rettv); - } ---- 6029,6036 ---- - argv[0].vval.v_string = vim_strsave(text); - argv[1].v_type = VAR_UNKNOWN; - -! call_callback(&curbuf->b_prompt_callback, -1, -! &rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE, NULL); - clear_tv(&argv[0]); - clear_tv(&rettv); - } -*************** -*** 6086,6100 **** - int dummy; - typval_T argv[1]; - -! if (curbuf->b_prompt_interrupt == NULL -! || *curbuf->b_prompt_interrupt == NUL) - return FALSE; - argv[0].v_type = VAR_UNKNOWN; - - got_int = FALSE; // don't skip executing commands -! call_func(curbuf->b_prompt_interrupt, -1, -! &rettv, 0, argv, NULL, 0L, 0L, &dummy, TRUE, -! curbuf->b_prompt_int_partial, NULL); - clear_tv(&rettv); - return TRUE; - } ---- 6045,6058 ---- - int dummy; - typval_T argv[1]; - -! if (curbuf->b_prompt_interrupt.cb_name == NULL -! || *curbuf->b_prompt_interrupt.cb_name == NUL) - return FALSE; - argv[0].v_type = VAR_UNKNOWN; - - got_int = FALSE; // don't skip executing commands -! call_callback(&curbuf->b_prompt_interrupt, -1, -! &rettv, 0, argv, NULL, 0L, 0L, &dummy, TRUE, NULL); - clear_tv(&rettv); - return TRUE; - } -*** ../vim-8.1.1436/src/proto/channel.pro 2019-01-12 22:47:01.264088074 +0100 ---- src/proto/channel.pro 2019-05-31 23:09:12.017119094 +0200 -*************** -*** 12,18 **** - void channel_set_pipes(channel_T *channel, sock_T in, sock_T out, sock_T err); - void channel_set_job(channel_T *channel, job_T *job, jobopt_T *options); - void channel_set_options(channel_T *channel, jobopt_T *opt); -! void channel_set_req_callback(channel_T *channel, ch_part_T part, char_u *callback, partial_T *partial, int id); - void channel_buffer_free(buf_T *buf); - void channel_write_any_lines(void); - void channel_write_new_lines(buf_T *buf); ---- 12,18 ---- - void channel_set_pipes(channel_T *channel, sock_T in, sock_T out, sock_T err); - void channel_set_job(channel_T *channel, job_T *job, jobopt_T *options); - void channel_set_options(channel_T *channel, jobopt_T *opt); -! void channel_set_req_callback(channel_T *channel, ch_part_T part, callback_T *callback, int id); - void channel_buffer_free(buf_T *buf); - void channel_write_any_lines(void); - void channel_write_new_lines(buf_T *buf); -*** ../vim-8.1.1436/src/buffer.c 2019-05-30 22:32:10.804178558 +0200 ---- src/buffer.c 2019-05-31 22:28:27.560903172 +0200 -*************** -*** 862,868 **** - #endif - #ifdef FEAT_JOB_CHANNEL - vim_free(buf->b_prompt_text); -! free_callback(buf->b_prompt_callback, buf->b_prompt_partial); - #endif - - buf_hashtab_remove(buf); ---- 862,868 ---- - #endif - #ifdef FEAT_JOB_CHANNEL - vim_free(buf->b_prompt_text); -! free_callback(&buf->b_prompt_callback); - #endif - - buf_hashtab_remove(buf); -*** ../vim-8.1.1436/src/userfunc.c 2019-05-28 23:08:12.080648632 +0200 ---- src/userfunc.c 2019-05-31 22:55:38.981219323 +0200 -*************** -*** 1447,1452 **** ---- 1447,1476 ---- - } - - /* -+ * Invoke call_func() with a callback. -+ */ -+ int -+ call_callback( -+ callback_T *callback, -+ int len, // length of "name" or -1 to use strlen() -+ typval_T *rettv, // return value goes here -+ int argcount, // number of "argvars" -+ typval_T *argvars, // vars for arguments, must have "argcount" -+ // PLUS ONE elements! -+ int (* argv_func)(int, typval_T *, int), -+ // function to fill in argvars -+ linenr_T firstline, // first line of range -+ linenr_T lastline, // last line of range -+ int *doesrange, // return: function handled range -+ int evaluate, -+ dict_T *selfdict) // Dictionary for "self" -+ { -+ return call_func(callback->cb_name, len, rettv, argcount, argvars, -+ argv_func, firstline, lastline, doesrange, evaluate, -+ callback->cb_partial, selfdict); -+ } -+ -+ /* - * Call a function with its resolved parameters - * - * "argv_func", when not NULL, can be used to fill in arguments only when the -*** ../vim-8.1.1436/src/proto/userfunc.pro 2018-12-18 21:56:25.084495836 +0100 ---- src/proto/userfunc.pro 2019-05-31 22:55:34.269243311 +0200 -*************** -*** 8,13 **** ---- 8,14 ---- - void restore_funccal(void); - void free_all_functions(void); - int func_call(char_u *name, typval_T *args, partial_T *partial, dict_T *selfdict, typval_T *rettv); -+ int call_callback(callback_T *callback, int len, typval_T *rettv, int argcount, typval_T *argvars, int (*argv_func)(int, typval_T *, int), linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, dict_T *selfdict); - int call_func(char_u *funcname, int len, typval_T *rettv, int argcount_in, typval_T *argvars_in, int (*argv_func)(int, typval_T *, int), linenr_T firstline, linenr_T lastline, int *doesrange, int evaluate, partial_T *partial, dict_T *selfdict_in); - char_u *trans_function_name(char_u **pp, int skip, int flags, funcdict_T *fdp, partial_T **partial); - void ex_function(exarg_T *eap); -*** ../vim-8.1.1436/src/eval.c 2019-05-28 23:08:12.056648758 +0200 ---- src/eval.c 2019-05-31 23:15:01.475368819 +0200 -*************** -*** 5920,5929 **** - dtv.vval.v_channel = job->jv_channel; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } -! if (job->jv_exit_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = job->jv_exit_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } - } ---- 5920,5929 ---- - dtv.vval.v_channel = job->jv_channel; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } -! if (job->jv_exit_cb.cb_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = job->jv_exit_cb.cb_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } - } -*************** -*** 5946,5974 **** - set_ref_in_item(jq->jq_value, copyID, ht_stack, list_stack); - for (cq = ch->ch_part[part].ch_cb_head.cq_next; cq != NULL; - cq = cq->cq_next) -! if (cq->cq_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = cq->cq_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } -! if (ch->ch_part[part].ch_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = ch->ch_part[part].ch_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } - } -! if (ch->ch_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = ch->ch_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } -! if (ch->ch_close_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = ch->ch_close_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } - } ---- 5946,5975 ---- - set_ref_in_item(jq->jq_value, copyID, ht_stack, list_stack); - for (cq = ch->ch_part[part].ch_cb_head.cq_next; cq != NULL; - cq = cq->cq_next) -! if (cq->cq_callback.cb_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = cq->cq_callback.cb_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } -! if (ch->ch_part[part].ch_callback.cb_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = -! ch->ch_part[part].ch_callback.cb_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } - } -! if (ch->ch_callback.cb_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = ch->ch_callback.cb_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } -! if (ch->ch_close_cb.cb_partial != NULL) - { - dtv.v_type = VAR_PARTIAL; -! dtv.vval.v_partial = ch->ch_close_cb.cb_partial; - set_ref_in_item(&dtv, copyID, ht_stack, list_stack); - } - } -*** ../vim-8.1.1436/src/ex_cmds2.c 2019-05-28 23:08:12.060648736 +0200 ---- src/ex_cmds2.c 2019-05-31 23:06:01.714074164 +0200 -*************** -*** 282,288 **** - static void - free_timer(timer_T *timer) - { -! free_callback(timer->tr_callback, timer->tr_partial); - vim_free(timer); - } - ---- 282,288 ---- - static void - free_timer(timer_T *timer) - { -! free_callback(&timer->tr_callback); - vim_free(timer); - } - -*************** -*** 325,333 **** - argv[0].vval.v_number = (varnumber_T)timer->tr_id; - argv[1].v_type = VAR_UNKNOWN; - -! call_func(timer->tr_callback, -1, -! &rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE, -! timer->tr_partial, NULL); - clear_tv(&rettv); - } - ---- 325,332 ---- - argv[0].vval.v_number = (varnumber_T)timer->tr_id; - argv[1].v_type = VAR_UNKNOWN; - -! call_callback(&timer->tr_callback, -1, -! &rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE, NULL); - clear_tv(&rettv); - } - -*************** -*** 542,558 **** - { - if (dict_add(dict, di) == FAIL) - vim_free(di); -- else if (timer->tr_partial != NULL) -- { -- di->di_tv.v_type = VAR_PARTIAL; -- di->di_tv.vval.v_partial = timer->tr_partial; -- ++timer->tr_partial->pt_refcount; -- } - else -! { -! di->di_tv.v_type = VAR_FUNC; -! di->di_tv.vval.v_string = vim_strsave(timer->tr_callback); -! } - } - } - ---- 541,548 ---- - { - if (dict_add(dict, di) == FAIL) - vim_free(di); - else -! put_callback(&timer->tr_callback, &di->di_tv); - } - } - -*************** -*** 578,592 **** - - for (timer = first_timer; timer != NULL; timer = timer->tr_next) - { -! if (timer->tr_partial != NULL) - { - tv.v_type = VAR_PARTIAL; -! tv.vval.v_partial = timer->tr_partial; - } - else - { - tv.v_type = VAR_FUNC; -! tv.vval.v_string = timer->tr_callback; - } - abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL); - } ---- 568,582 ---- - - for (timer = first_timer; timer != NULL; timer = timer->tr_next) - { -! if (timer->tr_callback.cb_partial != NULL) - { - tv.v_type = VAR_PARTIAL; -! tv.vval.v_partial = timer->tr_callback.cb_partial; - } - else - { - tv.v_type = VAR_FUNC; -! tv.vval.v_string = timer->tr_callback.cb_name; - } - abort = abort || set_ref_in_item(&tv, copyID, NULL, NULL); - } -*** ../vim-8.1.1436/src/popupwin.c 2019-05-30 22:32:10.804178558 +0200 ---- src/popupwin.c 2019-05-31 23:07:27.541643206 +0200 -*************** -*** 149,158 **** - if (get_lambda_tv(&ptr, &tv, TRUE) == OK) - { - wp->w_popup_timer = create_timer(nr, 0); -! wp->w_popup_timer->tr_callback = - vim_strsave(partial_name(tv.vval.v_partial)); -! func_ref(wp->w_popup_timer->tr_callback); -! wp->w_popup_timer->tr_partial = tv.vval.v_partial; - } - } - #endif ---- 149,158 ---- - if (get_lambda_tv(&ptr, &tv, TRUE) == OK) - { - wp->w_popup_timer = create_timer(nr, 0); -! wp->w_popup_timer->tr_callback.cb_name = - vim_strsave(partial_name(tv.vval.v_partial)); -! func_ref(wp->w_popup_timer->tr_callback.cb_name); -! wp->w_popup_timer->tr_callback.cb_partial = tv.vval.v_partial; - } - } - #endif -*** ../vim-8.1.1436/src/version.c 2019-05-31 20:42:04.694287075 +0200 ---- src/version.c 2019-06-01 13:19:22.800368900 +0200 -*************** -*** 769,770 **** ---- 769,772 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 1437, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -70. ISDN lines are added to your house on a hourly basis - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ an exciting new programming language -- http://www.Zimbu.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |