# HG changeset patch # User Christian Brabandt # Date 1458245710 -3600 # Node ID dc36cef103de366818e5061d326201eea2d84795 # Parent 628fe55c56ba3d0e1ba123ac70cf9997e8d12a5f commit https://github.com/vim/vim/commit/8a1bb046378f4bc68d6a04af2eab80fb3ce04da6 Author: Bram Moolenaar Date: Thu Mar 17 21:11:53 2016 +0100 patch 7.4.1586 Problem: Nesting partials doesn't work. Solution: Append arguments. (Ken Takata) diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -11814,6 +11814,7 @@ f_function(typval_T *argvars, typval_T * char_u *s; char_u *name; int use_string = FALSE; + partial_T *arg_pt = NULL; if (argvars[0].v_type == VAR_FUNC) { @@ -11822,8 +11823,11 @@ f_function(typval_T *argvars, typval_T * } else if (argvars[0].v_type == VAR_PARTIAL && argvars[0].vval.v_partial != NULL) + { /* function(dict.MyFunc, [arg]) */ - s = argvars[0].vval.v_partial->pt_name; + arg_pt = argvars[0].vval.v_partial; + s = arg_pt->pt_name; + } else { /* function('MyFunc', [arg], dict) */ @@ -11901,19 +11905,27 @@ f_function(typval_T *argvars, typval_T * arg_idx = 0; } } - if (dict_idx > 0 || arg_idx > 0) + if (dict_idx > 0 || arg_idx > 0 || arg_pt != NULL) { partial_T *pt = (partial_T *)alloc_clear(sizeof(partial_T)); + /* result is a VAR_PARTIAL */ if (pt != NULL) { - if (arg_idx > 0) + if (arg_idx > 0 || (arg_pt != NULL && arg_pt->pt_argc > 0)) { listitem_T *li; int i = 0; - + int arg_len = 0; + int lv_len = 0; + + if (arg_pt != NULL) + arg_len = arg_pt->pt_argc; + if (list != NULL) + lv_len = list->lv_len; + pt->pt_argc = arg_len + lv_len; pt->pt_argv = (typval_T *)alloc( - sizeof(typval_T) * list->lv_len); + sizeof(typval_T) * pt->pt_argc); if (pt->pt_argv == NULL) { vim_free(pt); @@ -11922,9 +11934,12 @@ f_function(typval_T *argvars, typval_T * } else { - pt->pt_argc = list->lv_len; - for (li = list->lv_first; li != NULL; li = li->li_next) - copy_tv(&li->li_tv, &pt->pt_argv[i++]); + for (i = 0; i < arg_len; i++) + copy_tv(&arg_pt->pt_argv[i], &pt->pt_argv[i]); + if (lv_len > 0) + for (li = list->lv_first; li != NULL; + li = li->li_next) + copy_tv(&li->li_tv, &pt->pt_argv[i++]); } } @@ -11935,10 +11950,11 @@ f_function(typval_T *argvars, typval_T * pt->pt_dict = argvars[dict_idx].vval.v_dict; ++pt->pt_dict->dv_refcount; } - else if (argvars[0].v_type == VAR_PARTIAL) - { - pt->pt_dict = argvars[0].vval.v_partial->pt_dict; - ++pt->pt_dict->dv_refcount; + else if (arg_pt != NULL) + { + pt->pt_dict = arg_pt->pt_dict; + if (pt->pt_dict != NULL) + ++pt->pt_dict->dv_refcount; } pt->pt_refcount = 1; @@ -11950,6 +11966,7 @@ f_function(typval_T *argvars, typval_T * } else { + /* result is a VAR_FUNC */ rettv->v_type = VAR_FUNC; rettv->vval.v_string = name; func_ref(name); 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 @@ -20,9 +20,17 @@ func Test_partial_args() call Cb("zzz") call assert_equal("foo/bar/xxx", Cb("xxx")) call assert_equal("foo/bar/yyy", call(Cb, ["yyy"])) + let Cb2 = function(Cb) + call assert_equal("foo/bar/zzz", Cb2("zzz")) + let Cb3 = function(Cb, ["www"]) + call assert_equal("foo/bar/www", Cb3()) let Cb = function('MyFunc', []) call assert_equal("a/b/c", Cb("a", "b", "c")) + let Cb2 = function(Cb, []) + call assert_equal("a/b/d", Cb2("a", "b", "d")) + let Cb3 = function(Cb, ["a", "b"]) + call assert_equal("a/b/e", Cb3("e")) let Sort = function('MySort', [1]) call assert_equal([1, 2, 3], sort([3, 1, 2], Sort)) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -749,6 +749,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1586, +/**/ 1585, /**/ 1584,