Skip to content

Commit 02abcf3

Browse files
shaneharperchrisbra
authored andcommitted
patch 9.2.0257: unnecessary memory allocation in set_callback()
Problem: Unnecessary memory allocation in set_callback(); after set_callback(), callers must manually free the source callback's name if cb_free_name is set. Solution: Refactor set_callback() to re-use the callback name when possible to avoid extra memory allocations and clean up so the callers do not have to take care themselves (Shane Harper). closes: #19831 Signed-off-by: Shane Harper <shane@shaneharper.net> Signed-off-by: Christian Brabandt <cb@256bit.org>
1 parent 06aa378 commit 02abcf3

10 files changed

Lines changed: 12 additions & 34 deletions

File tree

src/change.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,8 +373,6 @@ f_listener_add(typval_T *argvars, typval_T *rettv)
373373
}
374374

375375
set_callback(&lnr->lr_callback, &callback);
376-
if (callback.cb_free_name)
377-
vim_free(callback.cb_name);
378376

379377
lnr->lr_id = ++next_listener_id;
380378
rettv->vval.v_number = lnr->lr_id;

src/clipboard.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3789,8 +3789,6 @@ clip_provider_get_callback(
37893789

37903790
// func_tv owns the function name, so we must make a copy for the callback
37913791
set_callback(callback, &cb);
3792-
if (cb.cb_free_name)
3793-
vim_free(cb.cb_name);
37943792
clear_tv(&func_tv);
37953793
return OK;
37963794
}

src/evalvars.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5289,26 +5289,27 @@ put_callback(callback_T *cb, typval_T *tv)
52895289
}
52905290
}
52915291

5292+
static bool
5293+
does_callback_own_cb_name(callback_T *cb)
5294+
{
5295+
// If cb_partial != NULL then *cb->cb_name is owned by the partial.
5296+
return cb->cb_partial || cb->cb_free_name;
5297+
}
5298+
52925299
/*
52935300
* Make a copy of "src" into "dest", allocating the function name if needed,
52945301
* without incrementing the refcount.
52955302
*/
52965303
void
52975304
set_callback(callback_T *dest, callback_T *src)
52985305
{
5299-
if (src->cb_partial == NULL)
5306+
*dest = *src;
5307+
if (!does_callback_own_cb_name(src))
53005308
{
5301-
// just a function name, make a copy
53025309
dest->cb_name = vim_strsave(src->cb_name);
53035310
dest->cb_free_name = TRUE;
53045311
}
5305-
else
5306-
{
5307-
// cb_name is a pointer into cb_partial
5308-
dest->cb_name = src->cb_name;
5309-
dest->cb_free_name = FALSE;
5310-
}
5311-
dest->cb_partial = src->cb_partial;
5312+
*src = (callback_T){0};
53125313
}
53135314

53145315
/*

src/job.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1699,8 +1699,6 @@ f_prompt_setcallback(typval_T *argvars, typval_T *rettv UNUSED)
16991699

17001700
free_callback(&buf->b_prompt_callback);
17011701
set_callback(&buf->b_prompt_callback, &callback);
1702-
if (callback.cb_free_name)
1703-
vim_free(callback.cb_name);
17041702
}
17051703

17061704
/*
@@ -1728,8 +1726,6 @@ f_prompt_setinterrupt(typval_T *argvars, typval_T *rettv UNUSED)
17281726

17291727
free_callback(&buf->b_prompt_interrupt);
17301728
set_callback(&buf->b_prompt_interrupt, &callback);
1731-
if (callback.cb_free_name)
1732-
vim_free(callback.cb_name);
17331729
}
17341730

17351731

src/option.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9239,8 +9239,6 @@ option_set_callback_func(char_u *optval UNUSED, callback_T *optcb UNUSED)
92399239

92409240
free_callback(optcb);
92419241
set_callback(optcb, &cb);
9242-
if (cb.cb_free_name)
9243-
vim_free(cb.cb_name);
92449242
free_tv(tv);
92459243

92469244
char_u *dot = NULL;

src/popupwin.c

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,8 +1037,6 @@ apply_general_options(win_T *wp, dict_T *dict)
10371037
{
10381038
free_callback(&wp->w_filter_cb);
10391039
set_callback(&wp->w_filter_cb, &callback);
1040-
if (callback.cb_free_name)
1041-
vim_free(callback.cb_name);
10421040
}
10431041
}
10441042
nr = dict_get_bool(dict, "mapping", -1);
@@ -1069,9 +1067,6 @@ apply_general_options(win_T *wp, dict_T *dict)
10691067

10701068
free_callback(&wp->w_close_cb);
10711069
set_callback(&wp->w_close_cb, &callback);
1072-
if (callback.cb_free_name)
1073-
vim_free(callback.cb_name);
1074-
10751070
return OK;
10761071
}
10771072

@@ -2527,8 +2522,6 @@ popup_create(typval_T *argvars, typval_T *rettv, create_type_T type)
25272522
if (callback.cb_name != NULL)
25282523
{
25292524
set_callback(&wp->w_filter_cb, &callback);
2530-
if (callback.cb_free_name)
2531-
vim_free(callback.cb_name);
25322525
}
25332526

25342527
wp->w_p_wrap = 0;

src/quickfix.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8158,11 +8158,7 @@ qf_setprop_qftf(qf_info_T *qi UNUSED, qf_list_T *qfl, dictitem_T *di)
81588158
cb = get_callback(&di->di_tv);
81598159
if (cb.cb_name == NULL || *cb.cb_name == NUL)
81608160
return OK;
8161-
81628161
set_callback(&qfl->qf_qftf_cb, &cb);
8163-
if (cb.cb_free_name)
8164-
vim_free(cb.cb_name);
8165-
81668162
return OK;
81678163
}
81688164

src/sound.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@ get_sound_callback(typval_T *arg)
6363
soundcb->snd_next = first_callback;
6464
first_callback = soundcb;
6565
set_callback(&soundcb->snd_callback, &callback);
66-
if (callback.cb_free_name)
67-
vim_free(callback.cb_name);
6866
return soundcb;
6967
}
7068

src/time.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -912,8 +912,6 @@ f_timer_start(typval_T *argvars, typval_T *rettv)
912912
return;
913913
}
914914
set_callback(&timer->tr_callback, &callback);
915-
if (callback.cb_free_name)
916-
vim_free(callback.cb_name);
917915
rettv->vval.v_number = (varnumber_T)timer->tr_id;
918916
}
919917

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,8 @@ static char *(features[]) =
734734

735735
static int included_patches[] =
736736
{ /* Add new patch number below this line */
737+
/**/
738+
257,
737739
/**/
738740
256,
739741
/**/

0 commit comments

Comments
 (0)