Skip to content

Commit 4f2707d

Browse files
committed
Merge remote-tracking branch 'vim/master'
2 parents ead07ed + 5498a41 commit 4f2707d

File tree

6 files changed

+68
-74
lines changed

6 files changed

+68
-74
lines changed

src/channel.c

Lines changed: 36 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,15 +1134,30 @@ find_buffer(char_u *name, int err)
11341134
return buf;
11351135
}
11361136

1137+
static void
1138+
set_callback(
1139+
char_u **cbp,
1140+
partial_T **pp,
1141+
char_u *callback,
1142+
partial_T *partial)
1143+
{
1144+
free_callback(*cbp, *pp);
1145+
if (callback != NULL && *callback != NUL)
1146+
*cbp = vim_strsave(callback);
1147+
else
1148+
*cbp = NULL;
1149+
*pp = partial;
1150+
if (*pp != NULL)
1151+
++(*pp)->pt_refcount;
1152+
}
1153+
11371154
/*
11381155
* Set various properties from an "opt" argument.
11391156
*/
11401157
void
11411158
channel_set_options(channel_T *channel, jobopt_T *opt)
11421159
{
11431160
int part;
1144-
char_u **cbp;
1145-
partial_T **pp;
11461161

11471162
if (opt->jo_set & JO_MODE)
11481163
for (part = PART_SOCK; part <= PART_IN; ++part)
@@ -1165,61 +1180,19 @@ channel_set_options(channel_T *channel, jobopt_T *opt)
11651180
channel->ch_part[PART_IN].ch_block_write = 1;
11661181

11671182
if (opt->jo_set & JO_CALLBACK)
1168-
{
1169-
cbp = &channel->ch_callback;
1170-
pp = &channel->ch_partial;
1171-
vim_free(*cbp);
1172-
partial_unref(*pp);
1173-
if (opt->jo_callback != NULL && *opt->jo_callback != NUL)
1174-
*cbp = vim_strsave(opt->jo_callback);
1175-
else
1176-
*cbp = NULL;
1177-
*pp = opt->jo_partial;
1178-
if (*pp != NULL)
1179-
++(*pp)->pt_refcount;
1180-
}
1183+
set_callback(&channel->ch_callback, &channel->ch_partial,
1184+
opt->jo_callback, opt->jo_partial);
11811185
if (opt->jo_set & JO_OUT_CALLBACK)
1182-
{
1183-
cbp = &channel->ch_part[PART_OUT].ch_callback;
1184-
pp = &channel->ch_part[PART_OUT].ch_partial;
1185-
vim_free(*cbp);
1186-
partial_unref(*pp);
1187-
if (opt->jo_out_cb != NULL && *opt->jo_out_cb != NUL)
1188-
*cbp = vim_strsave(opt->jo_out_cb);
1189-
else
1190-
*cbp = NULL;
1191-
*pp = opt->jo_out_partial;
1192-
if (*pp != NULL)
1193-
++(*pp)->pt_refcount;
1194-
}
1186+
set_callback(&channel->ch_part[PART_OUT].ch_callback,
1187+
&channel->ch_part[PART_OUT].ch_partial,
1188+
opt->jo_out_cb, opt->jo_out_partial);
11951189
if (opt->jo_set & JO_ERR_CALLBACK)
1196-
{
1197-
cbp = &channel->ch_part[PART_ERR].ch_callback;
1198-
pp = &channel->ch_part[PART_ERR].ch_partial;
1199-
vim_free(*cbp);
1200-
partial_unref(*pp);
1201-
if (opt->jo_err_cb != NULL && *opt->jo_err_cb != NUL)
1202-
*cbp = vim_strsave(opt->jo_err_cb);
1203-
else
1204-
*cbp = NULL;
1205-
*pp = opt->jo_err_partial;
1206-
if (*pp != NULL)
1207-
++(*pp)->pt_refcount;
1208-
}
1190+
set_callback(&channel->ch_part[PART_ERR].ch_callback,
1191+
&channel->ch_part[PART_ERR].ch_partial,
1192+
opt->jo_err_cb, opt->jo_err_partial);
12091193
if (opt->jo_set & JO_CLOSE_CALLBACK)
1210-
{
1211-
cbp = &channel->ch_close_cb;
1212-
pp = &channel->ch_close_partial;
1213-
vim_free(*cbp);
1214-
partial_unref(*pp);
1215-
if (opt->jo_close_cb != NULL && *opt->jo_close_cb != NUL)
1216-
*cbp = vim_strsave(opt->jo_close_cb);
1217-
else
1218-
*cbp = NULL;
1219-
*pp = opt->jo_close_partial;
1220-
if (*pp != NULL)
1221-
++(*pp)->pt_refcount;
1222-
}
1194+
set_callback(&channel->ch_close_cb, &channel->ch_close_partial,
1195+
opt->jo_close_cb, opt->jo_close_partial);
12231196

12241197
if ((opt->jo_set & JO_OUT_IO) && opt->jo_io[PART_OUT] == JIO_BUFFER)
12251198
{
@@ -2249,8 +2222,7 @@ invoke_one_time_callback(
22492222
* invokes ch_close() the list will be cleared. */
22502223
remove_cb_node(cbhead, item);
22512224
invoke_callback(channel, item->cq_callback, item->cq_partial, argv);
2252-
vim_free(item->cq_callback);
2253-
partial_unref(item->cq_partial);
2225+
free_callback(item->cq_callback, item->cq_partial);
22542226
vim_free(item);
22552227
}
22562228

@@ -2746,9 +2718,8 @@ channel_close(channel_T *channel, int invoke_close_cb)
27462718
}
27472719

27482720
/* the callback is only called once */
2749-
vim_free(channel->ch_close_cb);
2721+
free_callback(channel->ch_close_cb, channel->ch_close_partial);
27502722
channel->ch_close_cb = NULL;
2751-
partial_unref(channel->ch_close_partial);
27522723
channel->ch_close_partial = NULL;
27532724

27542725
--channel->ch_refcount;
@@ -2784,8 +2755,7 @@ channel_clear_one(channel_T *channel, int part)
27842755
cbq_T *node = cb_head->cq_next;
27852756

27862757
remove_cb_node(cb_head, node);
2787-
vim_free(node->cq_callback);
2788-
partial_unref(node->cq_partial);
2758+
free_callback(node->cq_callback, node->cq_partial);
27892759
vim_free(node);
27902760
}
27912761

@@ -2795,9 +2765,9 @@ channel_clear_one(channel_T *channel, int part)
27952765
remove_json_node(json_head, json_head->jq_next);
27962766
}
27972767

2798-
vim_free(channel->ch_part[part].ch_callback);
2768+
free_callback(channel->ch_part[part].ch_callback,
2769+
channel->ch_part[part].ch_partial);
27992770
channel->ch_part[part].ch_callback = NULL;
2800-
partial_unref(channel->ch_part[part].ch_partial);
28012771
channel->ch_part[part].ch_partial = NULL;
28022772
}
28032773

@@ -2814,13 +2784,11 @@ channel_clear(channel_T *channel)
28142784
channel_clear_one(channel, PART_OUT);
28152785
channel_clear_one(channel, PART_ERR);
28162786
/* there is no callback or queue for PART_IN */
2817-
vim_free(channel->ch_callback);
2787+
free_callback(channel->ch_callback, channel->ch_partial);
28182788
channel->ch_callback = NULL;
2819-
partial_unref(channel->ch_partial);
28202789
channel->ch_partial = NULL;
2821-
vim_free(channel->ch_close_cb);
2790+
free_callback(channel->ch_close_cb, channel->ch_close_partial);
28222791
channel->ch_close_cb = NULL;
2823-
partial_unref(channel->ch_close_partial);
28242792
channel->ch_close_partial = NULL;
28252793
}
28262794

@@ -4344,8 +4312,7 @@ job_free_contents(job_T *job)
43444312
mch_clear_job(job);
43454313

43464314
vim_free(job->jv_stoponexit);
4347-
vim_free(job->jv_exit_cb);
4348-
partial_unref(job->jv_exit_partial);
4315+
free_callback(job->jv_exit_cb, job->jv_exit_partial);
43494316
}
43504317

43514318
static void
@@ -4510,8 +4477,7 @@ job_set_options(job_T *job, jobopt_T *opt)
45104477
}
45114478
if (opt->jo_set & JO_EXIT_CB)
45124479
{
4513-
vim_free(job->jv_exit_cb);
4514-
partial_unref(job->jv_exit_partial);
4480+
free_callback(job->jv_exit_cb, job->jv_exit_partial);
45154481
if (opt->jo_exit_cb == NULL || *opt->jo_exit_cb == NUL)
45164482
{
45174483
job->jv_exit_cb = NULL;

src/eval.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13127,11 +13127,13 @@ f_getcompletion(typval_T *argvars, typval_T *rettv)
1312713127
return;
1312813128
}
1312913129

13130+
# if defined(FEAT_MENU)
1313013131
if (xpc.xp_context == EXPAND_MENUS)
1313113132
{
1313213133
set_context_in_menu_cmd(&xpc, (char_u *)"menu", xpc.xp_pattern, FALSE);
1313313134
xpc.xp_pattern_len = (int)STRLEN(xpc.xp_pattern);
1313413135
}
13136+
# endif
1313513137

1313613138
pat = addstar(xpc.xp_pattern, xpc.xp_pattern_len, xpc.xp_context);
1313713139
if ((rettv_list_alloc(rettv) != FAIL) && (pat != NULL))
@@ -21205,13 +21207,33 @@ get_callback(typval_T *arg, partial_T **pp)
2120521207
return (*pp)->pt_name;
2120621208
}
2120721209
*pp = NULL;
21208-
if (arg->v_type == VAR_FUNC || arg->v_type == VAR_STRING)
21210+
if (arg->v_type == VAR_FUNC)
21211+
{
21212+
func_ref(arg->vval.v_string);
21213+
return arg->vval.v_string;
21214+
}
21215+
if (arg->v_type == VAR_STRING)
2120921216
return arg->vval.v_string;
2121021217
if (arg->v_type == VAR_NUMBER && arg->vval.v_number == 0)
2121121218
return (char_u *)"";
2121221219
EMSG(_("E921: Invalid callback argument"));
2121321220
return NULL;
2121421221
}
21222+
21223+
/*
21224+
* Unref/free "callback" and "partial" retured by get_callback().
21225+
*/
21226+
void
21227+
free_callback(char_u *callback, partial_T *partial)
21228+
{
21229+
if (partial != NULL)
21230+
partial_unref(partial);
21231+
else if (callback != NULL)
21232+
{
21233+
func_unref(callback);
21234+
vim_free(callback);
21235+
}
21236+
}
2121521237
#endif
2121621238

2121721239
#ifdef FEAT_TIMERS

src/ex_cmds2.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1121,8 +1121,7 @@ remove_timer(timer_T *timer)
11211121
static void
11221122
free_timer(timer_T *timer)
11231123
{
1124-
vim_free(timer->tr_callback);
1125-
partial_unref(timer->tr_partial);
1124+
free_callback(timer->tr_callback, timer->tr_partial);
11261125
vim_free(timer);
11271126
}
11281127

src/mbyte.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4357,7 +4357,7 @@ enc_locale(void)
43574357
else
43584358
s = p + 1;
43594359
}
4360-
for (i = 0; s[i] != NUL && i < (int)sizeof(buf) - 1; ++i)
4360+
for (i = 0; i < (int)sizeof(buf) - 1 && s[i] != NUL; ++i)
43614361
{
43624362
if (s[i] == '_' || s[i] == '-')
43634363
buf[i] = '-';

src/proto/eval.pro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ void mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv);
9494
float_T vim_round(float_T f);
9595
long do_searchpair(char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit);
9696
char_u *get_callback(typval_T *arg, partial_T **pp);
97+
void free_callback(char_u *callback, partial_T *partial);
9798
void set_vim_var_nr(int idx, varnumber_T val);
9899
varnumber_T get_vim_var_nr(int idx);
99100
char_u *get_vim_var_str(int idx);

src/version.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,12 @@ static char *(features[]) =
773773

774774
static int included_patches[] =
775775
{ /* Add new patch number below this line */
776+
/**/
777+
2028,
778+
/**/
779+
2027,
780+
/**/
781+
2026,
776782
/**/
777783
2025,
778784
/**/

0 commit comments

Comments
 (0)