]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.264 v7.4.264
authorBram Moolenaar <Bram@vim.org>
Wed, 23 Apr 2014 18:43:41 +0000 (20:43 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 23 Apr 2014 18:43:41 +0000 (20:43 +0200)
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.

src/eval.c
src/testdir/test_eval.in
src/testdir/test_eval.ok
src/version.c

index c96a4e4e50d07acaed27baa5a42ce4b79bad07d5..d0b58ea63520abaaaf4f2f6395a5f33fd83f96cd 100644 (file)
@@ -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;
        }
     }
index cb942011be029e7e553b4fe86d4a78dfb9cacfe6..4919694bea5da0ad8351a7a6d9830bb584e8675f 100644 (file)
@@ -144,7 +144,7 @@ endfun
 :delcommand AR
 :call garbagecollect(1)
 :"
-:" function name includes a colon
+:" function name not starting with capital
 :try
 :func! g:test()
 :echo "test"
@@ -153,6 +153,15 @@ endfun
 :$put =v:exception
 :endtry
 :"
+:" function name includes a colon
+:try
+:func! b:test()
+:echo "test"
+:endfunc
+:catch
+:$put =v:exception
+:endtry
+:"
 :" function name folowed by #
 :try
 :func! test2() "#
@@ -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 100644 (file)
Binary files a/src/testdir/test_eval.ok and b/src/testdir/test_eval.ok differ
index 0ab6fa6088899db7b0b1199ce39d02a204a1a431..fc95a5ad028e0a7d09eac502079b3a7ebe48ff0a 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    264,
 /**/
     263,
 /**/