Problem: Computing function length name in many places.
Solution: compute name length in call_func().
argv[0].v_type = VAR_CHANNEL;
argv[0].vval.v_channel = channel;
- call_func(callback, (int)STRLEN(callback), &rettv, 2, argv, NULL,
+ call_func(callback, -1, &rettv, 2, argv, NULL,
0L, 0L, &dummy, TRUE, partial, NULL);
clear_tv(&rettv);
channel_need_redraw = TRUE;
(char *)channel->ch_close_cb);
argv[0].v_type = VAR_CHANNEL;
argv[0].vval.v_channel = channel;
- call_func(channel->ch_close_cb, (int)STRLEN(channel->ch_close_cb),
+ call_func(channel->ch_close_cb, -1,
&rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE,
channel->ch_close_partial, NULL);
clear_tv(&rettv);
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, (int)STRLEN(job->jv_exit_cb),
+ call_func(job->jv_exit_cb, -1,
&rettv, 2, argv, NULL, 0L, 0L, &dummy, TRUE,
job->jv_exit_partial, NULL);
clear_tv(&rettv);
argv[0].vval.v_string = vim_strsave(text);
argv[1].v_type = VAR_UNKNOWN;
- call_func(curbuf->b_prompt_callback,
- (int)STRLEN(curbuf->b_prompt_callback),
+ call_func(curbuf->b_prompt_callback, -1,
&rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE,
curbuf->b_prompt_partial, NULL);
clear_tv(&argv[0]);
argv[0].v_type = VAR_UNKNOWN;
got_int = FALSE; // don't skip executing commands
- call_func(curbuf->b_prompt_interrupt,
- (int)STRLEN(curbuf->b_prompt_interrupt),
+ call_func(curbuf->b_prompt_interrupt, -1,
&rettv, 0, argv, NULL, 0L, 0L, &dummy, TRUE,
curbuf->b_prompt_int_partial, NULL);
clear_tv(&rettv);
s = expr->vval.v_string;
if (s == NULL || *s == NUL)
return FAIL;
- if (call_func(s, (int)STRLEN(s), rettv, argc, argv, NULL,
+ if (call_func(s, -1, rettv, argc, argv, NULL,
0L, 0L, &dummy, TRUE, NULL, NULL) == FAIL)
return FAIL;
}
s = partial_name(partial);
if (s == NULL || *s == NUL)
return FAIL;
- if (call_func(s, (int)STRLEN(s), rettv, argc, argv, NULL,
+ if (call_func(s, -1, rettv, argc, argv, NULL,
0L, 0L, &dummy, TRUE, partial, NULL) == FAIL)
return FAIL;
}
int ret;
rettv->v_type = VAR_UNKNOWN; /* clear_tv() uses this */
- ret = call_func(func, (int)STRLEN(func), rettv, argc, argv, NULL,
+ ret = call_func(func, -1, rettv, argc, argv, NULL,
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
&doesrange, TRUE, NULL, NULL);
if (ret == FAIL)
}
else
s = (char_u *)"";
- ret = get_func_tv(s, (int)STRLEN(s), rettv, arg,
+ ret = get_func_tv(s, -1, rettv, arg,
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
&len, evaluate, pt, selfdict);
{"line2byte", 1, 1, f_line2byte},
{"lispindent", 1, 1, f_lispindent},
{"list2str", 1, 2, f_list2str},
+ {"listener_add", 1, 2, f_listener_add},
+ {"listener_remove", 1, 1, f_listener_remove},
{"localtime", 0, 0, f_localtime},
#ifdef FEAT_FLOAT
{"log", 1, 1, f_log},
if (failed)
{
+ // an empty list is returned on error
list_free(rettv->vval.v_list);
- /* readfile doc says an empty list is returned on error */
- rettv->vval.v_list = list_alloc();
+ rettv_list_alloc(rettv);
}
vim_free(prev);
copy_tv(&si2->item->li_tv, &argv[1]);
rettv.v_type = VAR_UNKNOWN; /* clear_tv() uses this */
- res = call_func(func_name, (int)STRLEN(func_name),
- &rettv, 2, argv, NULL, 0L, 0L, &dummy, TRUE,
+ res = call_func(func_name, -1, &rettv, 2, argv, NULL, 0L, 0L, &dummy, TRUE,
partial, sortinfo->item_compare_selfdict);
clear_tv(&argv[0]);
clear_tv(&argv[1]);
argv[0].vval.v_number = (varnumber_T)timer->tr_id;
argv[1].v_type = VAR_UNKNOWN;
- call_func(timer->tr_callback, (int)STRLEN(timer->tr_callback),
+ call_func(timer->tr_callback, -1,
&rettv, 1, argv, NULL, 0L, 0L, &dummy, TRUE,
timer->tr_partial, NULL);
clear_tv(&rettv);
if (expr->v_type == VAR_FUNC)
{
s = expr->vval.v_string;
- call_func(s, (int)STRLEN(s), &rettv,
+ call_func(s, -1, &rettv,
1, argv, fill_submatch_list,
0L, 0L, &dummy, TRUE, NULL, NULL);
}
partial_T *partial = expr->vval.v_partial;
s = partial_name(partial);
- call_func(s, (int)STRLEN(s), &rettv,
+ call_func(s, -1, &rettv,
1, argv, fill_submatch_list,
0L, 0L, &dummy, TRUE, partial, NULL);
}
argvars[0].v_type = VAR_NUMBER;
argvars[0].vval.v_number = term->tl_buffer->b_fnum;
argvars[1] = item->li_next->li_tv;
- if (call_func(func, (int)STRLEN(func), &rettv,
+ if (call_func(func, -1, &rettv,
2, argvars, /* argv_func */ NULL,
/* firstline */ 1, /* lastline */ 1,
&doesrange, /* evaluate */ TRUE,
*/
int
get_func_tv(
- char_u *name, /* name of the function */
- int len, /* length of "name" */
+ char_u *name, // name of the function
+ int len, // length of "name" or -1 to use strlen()
typval_T *rettv,
- char_u **arg, /* argument, pointing to the '(' */
- linenr_T firstline, /* first line of range */
- linenr_T lastline, /* last line of range */
- int *doesrange, /* return: function handled range */
+ char_u **arg, // argument, pointing to the '('
+ linenr_T firstline, // first line of range
+ linenr_T lastline, // last line of range
+ int *doesrange, // return: function handled range
int evaluate,
- partial_T *partial, /* for extra arguments */
- dict_T *selfdict) /* Dictionary for "self" */
+ partial_T *partial, // for extra arguments
+ dict_T *selfdict) // Dictionary for "self"
{
char_u *argp;
int ret = OK;
}
if (item == NULL)
- r = call_func(name, (int)STRLEN(name), rettv, argc, argv, NULL,
+ r = call_func(name, -1, rettv, argc, argv, NULL,
curwin->w_cursor.lnum, curwin->w_cursor.lnum,
&dummy, TRUE, partial, selfdict);
*/
int
call_func(
- char_u *funcname, /* name of the function */
- int len, /* length of "name" */
- typval_T *rettv, /* return value goes here */
- int argcount_in, /* number of "argvars" */
- typval_T *argvars_in, /* vars for arguments, must have "argcount"
- PLUS ONE elements! */
+ char_u *funcname, // name of the function
+ int len, // length of "name" or -1 to use strlen()
+ typval_T *rettv, // return value goes here
+ int argcount_in, // number of "argvars"
+ typval_T *argvars_in, // 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 */
+ // 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,
- partial_T *partial, /* optional, can be NULL */
- dict_T *selfdict_in) /* Dictionary for "self" */
+ partial_T *partial, // optional, can be NULL
+ dict_T *selfdict_in) // Dictionary for "self"
{
int ret = FAIL;
int error = ERROR_NONE;
typval_T argv[MAX_FUNC_ARGS + 1]; /* used when "partial" is not NULL */
int argv_clear = 0;
- /* Make a copy of the name, if it comes from a funcref variable it could
- * be changed or deleted in the called function. */
- name = vim_strnsave(funcname, len);
+ // Make a copy of the name, if it comes from a funcref variable it could
+ // be changed or deleted in the called function.
+ name = len > 0 ? vim_strnsave(funcname, len) : vim_strsave(funcname);
if (name == NULL)
return ret;
curwin->w_cursor.coladd = 0;
}
arg = startarg;
- if (get_func_tv(name, (int)STRLEN(name), &rettv, &arg,
+ if (get_func_tv(name, -1, &rettv, &arg,
eap->line1, eap->line2, &doesrange,
!eap->skip, partial, fudi.fd_dict) == FAIL)
{
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1319,
+/**/
+ 1318,
/**/
1317,
/**/