# HG changeset patch # User Bram Moolenaar # Date 1369910152 -7200 # Node ID 66e615ce7f61948a2a4a8615d703a42d56763490 # Parent 980dfdc910b3ff318ac59b0ff9b3b7a39141380d updated for version 7.3.1058 Problem: Call of funcref does not succeed in other script. Solution: Python patch 17: add get_expanded_name(). (ZyX) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -810,7 +810,6 @@ static int # endif prof_self_cmp __ARGS((const void *s1, const void *s2)); #endif -static int script_autoload __ARGS((char_u *name, int reload)); static char_u *autoload_name __ARGS((char_u *name)); static void cat_func_name __ARGS((char_u *buf, ufunc_T *fp)); static void func_free __ARGS((ufunc_T *fp)); @@ -10946,16 +10945,25 @@ f_function(argvars, rettv) typval_T *rettv; { char_u *s; + char_u *name = NULL; s = get_tv_string(&argvars[0]); if (s == NULL || *s == NUL || VIM_ISDIGIT(*s)) EMSG2(_(e_invarg2), s); - /* Don't check an autoload name for existence here. */ - else if (vim_strchr(s, AUTOLOAD_CHAR) == NULL && !function_exists(s)) + /* Don't check an autoload name for existence here, but still expand it + * checking for validity */ + else if ((name = get_expanded_name(s, vim_strchr(s, AUTOLOAD_CHAR) == NULL)) + == NULL) EMSG2(_("E700: Unknown function: %s"), s); else { - rettv->vval.v_string = vim_strsave(s); + if (name == NULL) + /* Autoload function, need to copy string */ + rettv->vval.v_string = vim_strsave(s); + else + /* Function found by get_expanded_name, string allocated by + * trans_function_name: no need to copy */ + rettv->vval.v_string = name; rettv->v_type = VAR_FUNC; } } @@ -21938,6 +21946,33 @@ function_exists(name) return n; } + char_u * +get_expanded_name(name, check) + char_u *name; + int check; +{ + char_u *nm = name; + char_u *p; + + p = trans_function_name(&nm, FALSE, TFN_INT|TFN_QUIET, NULL); + + if (p != NULL && *nm == NUL) + { + if (!check) + return p; + else if (builtin_function(p)) + { + if (find_internal_func(p) >= 0) + return p; + } + else + if (find_func(p) != NULL) + return p; + } + vim_free(p); + return NULL; +} + /* * Return TRUE if "name" looks like a builtin function name: starts with a * lower case letter and doesn't contain a ':' or AUTOLOAD_CHAR. @@ -22146,7 +22181,7 @@ prof_self_cmp(s1, s2) * If "name" has a package name try autoloading the script for it. * Return TRUE if a package was loaded. */ - static int + int script_autoload(name, reload) char_u *name; int reload; /* load script again when already loaded */ diff --git a/src/proto/eval.pro b/src/proto/eval.pro --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -77,6 +77,7 @@ char_u *get_dict_string __ARGS((dict_T * long get_dict_number __ARGS((dict_T *d, char_u *key)); char_u *get_function_name __ARGS((expand_T *xp, int idx)); char_u *get_expr_name __ARGS((expand_T *xp, int idx)); +char_u *get_expanded_name __ARGS((char_u *name, int check)); int func_call __ARGS((char_u *name, typval_T *args, dict_T *selfdict, typval_T *rettv)); void mzscheme_call_vim __ARGS((char_u *name, typval_T *args, typval_T *rettv)); long do_searchpair __ARGS((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)); @@ -129,4 +130,5 @@ void last_set_msg __ARGS((scid_T scriptI void ex_oldfiles __ARGS((exarg_T *eap)); int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen)); char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags)); +int script_autoload __ARGS((char_u *name, int reload)); /* vim: set ft=c : */ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1058, +/**/ 1057, /**/ 1056,