# HG changeset patch # User Christian Brabandt # Date 1458414905 -3600 # Node ID ff41ece2e4b81b75368104a667d905c10e68ed2b # Parent eb6ce99959941f228c2866cf0ef16f78c96132a4 commit https://github.com/vim/vim/commit/5c29154b521e9948190be653cfda666ecbb63b5b Author: Bram Moolenaar Date: Sat Mar 19 20:05:45 2016 +0100 patch 7.4.1608 Problem: string() doesn't handle a partial. Solution: Make a string from a partial. diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -7897,9 +7897,49 @@ tv2string( *tofree = string_quote(tv->vval.v_string, TRUE); return *tofree; case VAR_PARTIAL: - *tofree = string_quote(tv->vval.v_partial == NULL ? NULL - : tv->vval.v_partial->pt_name, TRUE); - return *tofree; + { + partial_T *pt = tv->vval.v_partial; + char_u *fname = string_quote(pt == NULL ? NULL + : pt->pt_name, FALSE); + garray_T ga; + int i; + char_u *tf; + + ga_init2(&ga, 1, 100); + ga_concat(&ga, (char_u *)"function("); + if (fname != NULL) + { + ga_concat(&ga, fname); + vim_free(fname); + } + if (pt != NULL && pt->pt_argc > 0) + { + ga_concat(&ga, (char_u *)", ["); + for (i = 0; i < pt->pt_argc; ++i) + { + if (i > 0) + ga_concat(&ga, (char_u *)", "); + ga_concat(&ga, + tv2string(&pt->pt_argv[i], &tf, numbuf, copyID)); + vim_free(tf); + } + ga_concat(&ga, (char_u *)"]"); + } + if (pt != NULL && pt->pt_dict != NULL) + { + typval_T dtv; + + ga_concat(&ga, (char_u *)", "); + dtv.v_type = VAR_DICT; + dtv.vval.v_dict = pt->pt_dict; + ga_concat(&ga, tv2string(&dtv, &tf, numbuf, copyID)); + vim_free(tf); + } + ga_concat(&ga, (char_u *)")"); + + *tofree = ga.ga_data; + return *tofree; + } case VAR_STRING: *tofree = string_quote(tv->vval.v_string, FALSE); return *tofree; 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 @@ -156,3 +156,17 @@ func Test_partial_exists() let lF = [F] call assert_true(exists('*lF[0]')) endfunc + +func Test_partial_string() + let F = function('MyFunc') + call assert_equal("function('MyFunc')", string(F)) + let F = function('MyFunc', ['foo']) + call assert_equal("function('MyFunc', ['foo'])", string(F)) + let F = function('MyFunc', ['foo', 'bar']) + call assert_equal("function('MyFunc', ['foo', 'bar'])", string(F)) + let d = {'one': 1} + let F = function('MyFunc', d) + call assert_equal("function('MyFunc', {'one': 1})", string(F)) + let F = function('MyFunc', ['foo'], d) + call assert_equal("function('MyFunc', ['foo'], {'one': 1})", string(F)) +endfunc 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 */ /**/ + 1608, +/**/ 1607, /**/ 1606,