]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 7.4.1842 v7.4.1842
authorBram Moolenaar <Bram@vim.org>
Tue, 24 May 2016 20:29:49 +0000 (22:29 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 24 May 2016 20:29:49 +0000 (22:29 +0200)
Problem:    get() works for Partial but not for Funcref.
Solution:   Accept Funcref.  Also return the function itself. (Nikolai Pavlov)

runtime/doc/eval.txt
src/eval.c
src/testdir/test_partial.vim
src/version.c

index 36133d839fbfa97bbebcbd7e3ce609930351ae64..8cc1099cfc27ae645d527e4d01a5f3492f2e6d7d 100644 (file)
@@ -1957,6 +1957,7 @@ function({name} [, {arglist}] [, {dict}])
 garbagecollect([{atexit}])     none    free memory, breaking cyclic references
 get({list}, {idx} [, {def}])   any     get item {idx} from {list} or {def}
 get({dict}, {key} [, {def}])   any     get item {key} from {dict} or {def}
+get({func}, {what})            any     get property of funcref/partial {func}
 getbufline({expr}, {lnum} [, {end}])
                                List    lines {lnum} to {end} of buffer {expr}
 getbufvar({expr}, {varname} [, {def}])
@@ -3771,9 +3772,10 @@ get({dict}, {key} [, {default}])
                Get item with key {key} from |Dictionary| {dict}.  When this
                item is not available return {default}.  Return zero when
                {default} is omitted.
-get({partial}, {what})
-               Get an item with from Funcref {partial}.  Possible values for
+get({func}, {what})
+               Get an item with from Funcref {func}.  Possible values for
                {what} are:
+                       'name'  The function name
                        'func'  The function
                        'dict'  The dictionary
                        'args'  The list with arguments
index 99b948c7d80f438bd9c14f3f60943cf608aa6bbe..41f98d2fa1f7764b3d95825d6a3e8f5c74b6a5f4 100644 (file)
@@ -12423,17 +12423,27 @@ f_get(typval_T *argvars, typval_T *rettv)
                tv = &di->di_tv;
        }
     }
-    else if (argvars[0].v_type == VAR_PARTIAL)
+    else if (argvars[0].v_type == VAR_PARTIAL || argvars[0].v_type == VAR_FUNC)
     {
-       partial_T       *pt = argvars[0].vval.v_partial;
+       partial_T       *pt;
+       partial_T       fref_pt;
+
+       if (argvars[0].v_type == VAR_PARTIAL)
+           pt = argvars[0].vval.v_partial;
+       else
+       {
+           vim_memset(&fref_pt, 0, sizeof(fref_pt));
+           fref_pt.pt_name = argvars[0].vval.v_string;
+           pt = &fref_pt;
+       }
 
        if (pt != NULL)
        {
            char_u *what = get_tv_string(&argvars[1]);
 
-           if (STRCMP(what, "func") == 0)
+           if (STRCMP(what, "func") == 0 || STRCMP(what, "name") == 0)
            {
-               rettv->v_type = VAR_STRING;
+               rettv->v_type = (*what == 'f' ? VAR_FUNC : VAR_STRING);
                if (pt->pt_name == NULL)
                    rettv->vval.v_string = NULL;
                else
index 30e1df99e7fbd6f2ebc52c05b3924f7635e5e247..af6ca6db25904046a60b0741d6345c44b54e7632 100644 (file)
@@ -282,9 +282,18 @@ endfunc
 
 func Test_get_partial_items()
   let dict = {'name': 'hello'}
-  let Cb = function('MyDictFunc', ["foo", "bar"], dict)
-  call assert_equal('MyDictFunc', get(Cb, 'func'))
-  call assert_equal(["foo", "bar"], get(Cb, 'args'))
+  let args = ["foo", "bar"]
+  let Func = function('MyDictFunc')
+  let Cb = function('MyDictFunc', args, dict)
+
+  call assert_equal(Func, get(Cb, 'func'))
+  call assert_equal('MyDictFunc', get(Cb, 'name'))
+  call assert_equal(args, get(Cb, 'args'))
   call assert_equal(dict, get(Cb, 'dict'))
   call assert_fails('call get(Cb, "xxx")', 'E475:')
+
+  call assert_equal(Func, get(Func, 'func'))
+  call assert_equal('MyDictFunc', get(Func, 'name'))
+  call assert_equal([], get(Func, 'args'))
+  call assert_true(empty( get(Func, 'dict')))
 endfunc
index 9e31e773215cdad902b60d48791080fcd76c89c8..d93be4881ed0d795acc1477f7527d29a3d05be93 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1842,
 /**/
     1841,
 /**/