changeset 5842:00acac0af680 v7.4.264

updated for version 7.4.264 Problem: Can't define a function starting with "g:". Can't assign a funcref to a buffer-local variable. Solution: Skip "g:" at the start of a function name. Don't check for colons when assigning to a variable.
author Bram Moolenaar <bram@vim.org>
date Wed, 23 Apr 2014 20:43:41 +0200
parents 3201f30b23e1
children 00e843ceb21b
files src/eval.c src/testdir/test_eval.in src/testdir/test_eval.ok src/version.c
diffstat 4 files changed, 26 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -21583,7 +21583,6 @@ ex_function(eap)
      * Get the function name.  There are these situations:
      * func	    normal function name
      *		    "name" == func, "fudi.fd_dict" == NULL
-     * s:func	    script-local function name
      * dict.func    new dictionary entry
      *		    "name" == NULL, "fudi.fd_dict" set,
      *		    "fudi.fd_di" == NULL, "fudi.fd_newkey" == func
@@ -21593,6 +21592,8 @@ ex_function(eap)
      * dict.func    existing dict entry that's not a Funcref
      *		    "name" == NULL, "fudi.fd_dict" set,
      *		    "fudi.fd_di" set, "fudi.fd_newkey" == NULL
+     * s:func	    script-local function name
+     * g:func	    global function name, same as "func"
      */
     p = eap->arg;
     name = trans_function_name(&p, eap->skip, 0, &fudi);
@@ -22286,7 +22287,8 @@ trans_function_name(pp, skip, flags, fdp
     }
     else
     {
-	if (lead == 2)	/* skip over "s:" */
+	/* skip over "s:" and "g:" */
+	if (lead == 2 || (lv.ll_name[0] == 'g' && lv.ll_name[1] == ':'))
 	    lv.ll_name += 2;
 	len = (int)(end - lv.ll_name);
     }
@@ -22317,17 +22319,16 @@ trans_function_name(pp, skip, flags, fdp
     else if (!(flags & TFN_INT) && builtin_function(lv.ll_name, len))
     {
 	EMSG2(_("E128: Function name must start with a capital or \"s:\": %s"),
-								  lv.ll_name);
+								       start);
 	goto theend;
     }
-    if (!skip)
+    if (!skip && !(flags & TFN_QUIET))
     {
 	char_u *cp = vim_strchr(lv.ll_name, ':');
 
 	if (cp != NULL && cp < end)
 	{
-	    EMSG2(_("E884: Function name cannot contain a colon: %s"),
-								  lv.ll_name);
+	    EMSG2(_("E884: Function name cannot contain a colon: %s"), start);
 	    goto theend;
 	}
     }
--- a/src/testdir/test_eval.in
+++ b/src/testdir/test_eval.in
@@ -144,9 +144,18 @@ endfun
 :delcommand AR
 :call garbagecollect(1)
 :"
+:" function name not starting with capital
+:try
+:func! g:test()
+:echo "test"
+:endfunc
+:catch
+:$put =v:exception
+:endtry
+:"
 :" function name includes a colon
 :try
-:func! g:test()
+:func! b:test()
 :echo "test"
 :endfunc
 :catch
@@ -162,6 +171,13 @@ endfun
 :$put =v:exception
 :endtry
 :"
+:" function name starting with/without "g:", buffer-local funcref.
+:function! g:Foo()
+:  $put ='called Foo()'
+:endfunction
+:let b:my_func = function('Foo')
+:call b:my_func()
+:"
 :/^start:/+1,$wq! test.out
 :" vim: et ts=4 isk-=\: fmr=???,???
 :call getchar()
index a0d0e458ce28443b40c66fda650fcb9669a6a909..57383be748130aaf7c90ad5ed77978e8374307b1
GIT binary patch
literal 10827
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
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    264,
+/**/
     263,
 /**/
     262,