# HG changeset patch # User Christian Brabandt # Date 1464121807 -7200 # Node ID 0cc48b3cd8846d922e871ab59a38672519fa9356 # Parent bc38030aec7d9350244584d4614be9bcfee23d7b commit https://github.com/vim/vim/commit/03e19a04ac2ca55643663b97b6ab94043233dcbd Author: Bram Moolenaar Date: Tue May 24 22:29:49 2016 +0200 patch 7.4.1842 Problem: get() works for Partial but not for Funcref. Solution: Accept Funcref. Also return the function itself. (Nikolai Pavlov) diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -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 diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -12423,17 +12423,27 @@ f_get(typval_T *argvars, typval_T *rettv tv = &di->di_tv; } } - else if (argvars[0].v_type == VAR_PARTIAL) - { - partial_T *pt = argvars[0].vval.v_partial; + else if (argvars[0].v_type == VAR_PARTIAL || argvars[0].v_type == VAR_FUNC) + { + 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) - { - rettv->v_type = VAR_STRING; + if (STRCMP(what, "func") == 0 || STRCMP(what, "name") == 0) + { + rettv->v_type = (*what == 'f' ? VAR_FUNC : VAR_STRING); if (pt->pt_name == NULL) rettv->vval.v_string = NULL; else diff --git a/src/testdir/test_partial.vim b/src/testdir/test_partial.vim --- a/src/testdir/test_partial.vim +++ b/src/testdir/test_partial.vim @@ -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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -754,6 +754,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1842, +/**/ 1841, /**/ 1840,