changeset 9117:0cc48b3cd884 v7.4.1842

commit https://github.com/vim/vim/commit/03e19a04ac2ca55643663b97b6ab94043233dcbd Author: Bram Moolenaar <Bram@vim.org> 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)
author Christian Brabandt <cb@256bit.org>
date Tue, 24 May 2016 22:30:07 +0200
parents bc38030aec7d
children c35c9121c72b
files runtime/doc/eval.txt src/eval.c src/testdir/test_partial.vim src/version.c
diffstat 4 files changed, 34 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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
--- 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
--- 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,