diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-03-17 21:11:53 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-03-17 21:11:53 +0100 |
commit | 8a1bb046378f4bc68d6a04af2eab80fb3ce04da6 (patch) | |
tree | eb65f3b2a78eb939f72723aa1931349a1073ad18 | |
parent | d22a18928ebcb465393da1418bb88204b97badb1 (diff) | |
download | vim-git-8a1bb046378f4bc68d6a04af2eab80fb3ce04da6.tar.gz |
patch 7.4.1586v7.4.1586
Problem: Nesting partials doesn't work.
Solution: Append arguments. (Ken Takata)
-rw-r--r-- | src/eval.c | 39 | ||||
-rw-r--r-- | src/testdir/test_partial.vim | 8 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 38 insertions, 11 deletions
diff --git a/src/eval.c b/src/eval.c index 9491f4f6a..cc23de490 100644 --- a/src/eval.c +++ b/src/eval.c @@ -11814,6 +11814,7 @@ f_function(typval_T *argvars, typval_T *rettv) 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 *rettv) } 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 *rettv) 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 *rettv) } 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 *rettv) pt->pt_dict = argvars[dict_idx].vval.v_dict; ++pt->pt_dict->dv_refcount; } - else if (argvars[0].v_type == VAR_PARTIAL) + else if (arg_pt != NULL) { - pt->pt_dict = argvars[0].vval.v_partial->pt_dict; - ++pt->pt_dict->dv_refcount; + 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 *rettv) } 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 index 21ad7376f..71d1837ca 100644 --- 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 index 7277cc09a..ec4f909fc 100644 --- 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, |