}
set_callback(&lnr->lr_callback, &callback);
- if (callback.cb_free_name)
- vim_free(callback.cb_name);
lnr->lr_id = ++next_listener_id;
rettv->vval.v_number = lnr->lr_id;
// func_tv owns the function name, so we must make a copy for the callback
set_callback(callback, &cb);
- if (cb.cb_free_name)
- vim_free(cb.cb_name);
clear_tv(&func_tv);
return OK;
}
}
}
+ static bool
+does_callback_own_cb_name(callback_T *cb)
+{
+ // If cb_partial != NULL then *cb->cb_name is owned by the partial.
+ return cb->cb_partial || cb->cb_free_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)
+ *dest = *src;
+ if (!does_callback_own_cb_name(src))
{
- // 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;
+ *src = (callback_T){0};
}
/*
free_callback(&buf->b_prompt_callback);
set_callback(&buf->b_prompt_callback, &callback);
- if (callback.cb_free_name)
- vim_free(callback.cb_name);
}
/*
free_callback(&buf->b_prompt_interrupt);
set_callback(&buf->b_prompt_interrupt, &callback);
- if (callback.cb_free_name)
- vim_free(callback.cb_name);
}
free_callback(optcb);
set_callback(optcb, &cb);
- if (cb.cb_free_name)
- vim_free(cb.cb_name);
free_tv(tv);
char_u *dot = NULL;
{
free_callback(&wp->w_filter_cb);
set_callback(&wp->w_filter_cb, &callback);
- if (callback.cb_free_name)
- vim_free(callback.cb_name);
}
}
nr = dict_get_bool(dict, "mapping", -1);
free_callback(&wp->w_close_cb);
set_callback(&wp->w_close_cb, &callback);
- if (callback.cb_free_name)
- vim_free(callback.cb_name);
-
return OK;
}
if (callback.cb_name != NULL)
{
set_callback(&wp->w_filter_cb, &callback);
- if (callback.cb_free_name)
- vim_free(callback.cb_name);
}
wp->w_p_wrap = 0;
cb = get_callback(&di->di_tv);
if (cb.cb_name == NULL || *cb.cb_name == NUL)
return OK;
-
set_callback(&qfl->qf_qftf_cb, &cb);
- if (cb.cb_free_name)
- vim_free(cb.cb_name);
-
return OK;
}
soundcb->snd_next = first_callback;
first_callback = soundcb;
set_callback(&soundcb->snd_callback, &callback);
- if (callback.cb_free_name)
- vim_free(callback.cb_name);
return soundcb;
}
return;
}
set_callback(&timer->tr_callback, &callback);
- if (callback.cb_free_name)
- vim_free(callback.cb_name);
rettv->vval.v_number = (varnumber_T)timer->tr_id;
}
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 257,
/**/
256,
/**/