Problem: Errors for functions are sometimes hard to read.
Solution: Use printable_func_name() in more places.
break;
case VAR_FUNC:
- if (echo_style)
{
- *tofree = NULL;
- r = tv->vval.v_string;
- }
- else
- {
- *tofree = string_quote(tv->vval.v_string, TRUE);
- r = *tofree;
+ char_u buf[MAX_FUNC_NAME_LEN];
+
+ if (echo_style)
+ {
+ r = make_ufunc_name_readable(tv->vval.v_string,
+ buf, MAX_FUNC_NAME_LEN);
+ if (r == buf)
+ {
+ r = vim_strsave(buf);
+ *tofree = r;
+ }
+ else
+ *tofree = NULL;
+ }
+ else
+ {
+ *tofree = string_quote(tv->vval.v_string == NULL ? NULL
+ : make_ufunc_name_readable(
+ tv->vval.v_string, buf, MAX_FUNC_NAME_LEN),
+ TRUE);
+ r = *tofree;
+ }
}
break;
/* userfunc.c */
void func_init(void);
hashtab_T *func_tbl_get(void);
+char_u *make_ufunc_name_readable(char_u *name, char_u *buf, size_t bufsize);
char_u *get_lambda_name(void);
char_u *register_cfunc(cfunc_T cb, cfunc_free_T cb_free, void *state);
int get_lambda_tv(char_u **arg, typval_T *rettv, int types_optional, evalarg_T *evalarg);
call v9.CheckDefFailure(["echo len('asdf'"], 'E110:', 2)
call v9.CheckScriptFailure(['vim9script', "echo len('asdf'"], 'E116:', 2)
- call v9.CheckDefAndScriptFailure(["echo Func0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], ['E1011:', 'E117:'], 1)
+ call v9.CheckDefAndScriptFailure(["echo Func01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789()"], ['E1011:', 'E117:'], 1)
call v9.CheckDefAndScriptFailure(["echo doesnotexist()"], 'E117:', 1)
endfunc
}
}
+/*
+ * If "name" starts with K_SPECIAL and "buf[bufsize]" is big enough
+ * return "buf" filled with a readable function name.
+ * Otherwise just return "name", thus the return value can always be used.
+ * "name" and "buf" may be equal.
+ */
+ char_u *
+make_ufunc_name_readable(char_u *name, char_u *buf, size_t bufsize)
+{
+ size_t len;
+
+ if (name[0] != K_SPECIAL)
+ return name;
+ len = STRLEN(name);
+ if (len + 3 > bufsize)
+ return name;
+
+ mch_memmove(buf + 5, name + 3, len + 1);
+ mch_memmove(buf, "<SNR>", 5);
+ return buf;
+}
+
/*
* Get a name for a lambda. Returned in static memory.
*/
{
case FCERR_UNKNOWN:
if (funcexe->fe_found_var)
- semsg(_(e_not_callable_type_str), name);
+ emsg_funcname(e_not_callable_type_str, name);
else
emsg_funcname(e_unknown_function_str, name);
break;
case FCERR_NOTMETHOD:
- emsg_funcname(
- N_(e_cannot_use_function_as_method_str), name);
+ emsg_funcname(e_cannot_use_function_as_method_str, name);
break;
case FCERR_DELETED:
emsg_funcname(e_function_was_deleted_str, name);
emsg_funcname(e_not_enough_arguments_for_function_str, name);
break;
case FCERR_SCRIPT:
- emsg_funcname(
- e_using_sid_not_in_script_context_str, name);
+ emsg_funcname(e_using_sid_not_in_script_context_str, name);
break;
case FCERR_DICT:
emsg_funcname(e_calling_dict_function_without_dictionary_str,
* cancelled due to an aborting error, an interrupt, or an exception.
*/
if (!aborting())
- {
user_func_error(error, (name != NULL) ? name : funcname, funcexe);
- }
// clear the copies made from the partial
while (argv_clear > 0)
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 4657,
/**/
4656,
/**/
if (error != FCERR_UNKNOWN)
{
if (error == FCERR_TOOMANY)
- semsg(_(e_too_many_arguments_for_function_str), ufunc->uf_name);
+ semsg(_(e_too_many_arguments_for_function_str),
+ printable_func_name(ufunc));
else
semsg(_(e_not_enough_arguments_for_function_str),
- ufunc->uf_name);
+ printable_func_name(ufunc));
return FAIL;
}
if (error != FCERR_NONE)
{
- user_func_error(error, ufunc->uf_name, &funcexe);
+ user_func_error(error, printable_func_name(ufunc), &funcexe);
return FAIL;
}
if (did_emsg > did_emsg_before)
if (res == FAIL)
{
if (called_emsg == called_emsg_before)
- semsg(_(e_unknown_function_str),
+ emsg_funcname(e_unknown_function_str,
name == NULL ? (char_u *)"[unknown]" : name);
return FAIL;
}
dictitem_T *v;
v = find_var(name, NULL, FALSE);
- if (v == NULL)
- {
- semsg(_(e_unknown_function_str), name);
- return FAIL;
- }
- if (v->di_tv.v_type != VAR_PARTIAL && v->di_tv.v_type != VAR_FUNC)
+ if (v == NULL || (v->di_tv.v_type != VAR_PARTIAL
+ && v->di_tv.v_type != VAR_FUNC))
{
- semsg(_(e_unknown_function_str), name);
+ emsg_funcname(e_unknown_function_str, name);
return FAIL;
}
return call_partial(&v->di_tv, argcount, ectx);
char_u *name = *arg;
char_u *p;
int argcount = argcount_init;
- char_u namebuf[100];
+ char_u namebuf[MAX_FUNC_NAME_LEN];
char_u fname_buf[FLEN_FIXED + 1];
char_u *tofree = NULL;
int error = FCERR_NONE;
res = generate_BCALL(cctx, idx, argcount, argcount_init == 1);
}
else
- semsg(_(e_unknown_function_str), namebuf);
+ emsg_funcname(e_unknown_function_str, namebuf);
goto theend;
}
&& vim_strchr(ufunc->uf_name, AUTOLOAD_CHAR) == NULL)
{
// A function name without g: prefix must be found locally.
- semsg(_(e_unknown_function_str), namebuf);
+ emsg_funcname(e_unknown_function_str, namebuf);
goto theend;
}
}
if (has_g_namespace || is_autoload)
res = generate_UCALL(cctx, name, argcount);
else
- semsg(_(e_unknown_function_str), namebuf);
+ emsg_funcname(e_unknown_function_str, namebuf);
theend:
vim_free(tofree);
}
if (ufunc->uf_def_status == UF_COMPILE_ERROR)
{
- emsg_funcname(_(e_call_to_function_that_failed_to_compile_str),
+ emsg_funcname(e_call_to_function_that_failed_to_compile_str,
ufunc->uf_name);
return FAIL;
}
if (argcount < type->tt_min_argcount - varargs)
{
- semsg(_(e_not_enough_arguments_for_function_str), name);
+ emsg_funcname(e_not_enough_arguments_for_function_str, name);
return FAIL;
}
if (!varargs && argcount > type->tt_argcount)
{
- semsg(_(e_too_many_arguments_for_function_str), name);
+ emsg_funcname(e_too_many_arguments_for_function_str, name);
return FAIL;
}
if (type->tt_args != NULL)
return OK; // just in case
if (totcount < type->tt_min_argcount - varargs)
{
- semsg(_(e_not_enough_arguments_for_function_str), name);
+ emsg_funcname(e_not_enough_arguments_for_function_str, name);
return FAIL;
}
if (!varargs && type->tt_argcount >= 0 && totcount > type->tt_argcount)
{
- semsg(_(e_too_many_arguments_for_function_str), name);
+ emsg_funcname(e_too_many_arguments_for_function_str, name);
return FAIL;
}
if (type->tt_args == NULL)