]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.1170 v7.3.1170
authorBram Moolenaar <Bram@vim.org>
Wed, 12 Jun 2013 11:37:43 +0000 (13:37 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 12 Jun 2013 11:37:43 +0000 (13:37 +0200)
Problem:    Patch 7.3.1058 breaks backwards compatibility, not possible to use
            a function reference as a string. (lilydjwg)
Solution:   Instead of translating the function name only translate "s:".

src/eval.c
src/version.c

index 81c3ca278a6ee657894e0ca16cb6fc5a8605ba36..4e4bbc04e6150590f425c97391c065e4bf8262b0 100644 (file)
@@ -10962,25 +10962,33 @@ 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, but still expand it 
-     * checking for validity */
-    else if ((name = get_expanded_name(s, vim_strchr(s, AUTOLOAD_CHAR) == NULL))
-                                                                       == NULL)
+    /* Don't check an autoload name for existence here. */
+    else if (vim_strchr(s, AUTOLOAD_CHAR) == NULL && !function_exists(s))
        EMSG2(_("E700: Unknown function: %s"), s);
     else
     {
-       if (name == NULL)
-           /* Autoload function, need to copy string */
-           rettv->vval.v_string = vim_strsave(s);
+       if (STRNCMP(s, "s:", 2) == 0)
+       {
+           char        sid_buf[25];
+
+           /* Expand s: into <SNR>nr_, so that the function can also be
+            * called from another script. Using trans_function_name() would
+            * also work, but some plugins depend on the name being printable
+            * text. */
+           sprintf(sid_buf, "<SNR>%ld_", (long)current_SID);
+           rettv->vval.v_string = alloc(STRLEN(sid_buf) + STRLEN(s + 2) + 1);
+           if (rettv->vval.v_string != NULL)
+           {
+               STRCPY(rettv->vval.v_string, sid_buf);
+               STRCAT(rettv->vval.v_string, s + 2);
+           }
+       }
        else
-           /* Function found by get_expanded_name, string allocated by 
-            * trans_function_name: no need to copy */
-           rettv->vval.v_string = name;
+           rettv->vval.v_string = vim_strsave(s);
        rettv->v_type = VAR_FUNC;
     }
 }
index 2996bad11c70c1a00d135179b376490e6af47750..e20ac7f41f7de31a22cedbd2b3f358464b1f327d 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1170,
 /**/
     1169,
 /**/