1
0
forked from aniani/vim

patch 7.4.1589

Problem:    Combining dict and args with partial doesn't always work.
Solution:   Use the arguments from the partial.
This commit is contained in:
Bram Moolenaar
2016-03-17 23:13:28 +01:00
parent 1ff2b64b11
commit 9e63f61cb0
3 changed files with 68 additions and 12 deletions

View File

@@ -3461,7 +3461,7 @@ ex_call(exarg_T *eap)
int doesrange;
int failed = FALSE;
funcdict_T fudi;
partial_T *partial;
partial_T *partial = NULL;
if (eap->skip)
{
@@ -3497,12 +3497,6 @@ ex_call(exarg_T *eap)
name = deref_func_name(tofree, &len,
partial != NULL ? NULL : &partial, FALSE);
/* When calling fdict.func(), where "func" is a partial, use "fdict"
* instead of the dict in the partial, for backwards compatibility.
* TODO: Do use the arguments in the partial? */
if (fudi.fd_dict != NULL)
partial = NULL;
/* Skip white space to allow ":call func ()". Not good, but required for
* backward compatibility. */
startarg = skipwhite(arg);
@@ -21734,17 +21728,18 @@ handle_subscript(
}
}
if (rettv->v_type == VAR_FUNC && selfdict != NULL)
if ((rettv->v_type == VAR_FUNC || rettv->v_type == VAR_PARTIAL)
&& selfdict != NULL)
{
char_u *fname;
char_u *fname = rettv->v_type == VAR_FUNC ? rettv->vval.v_string
: rettv->vval.v_partial->pt_name;
char_u *tofree = NULL;
ufunc_T *fp;
char_u fname_buf[FLEN_FIXED + 1];
int error;
/* Translate "s:func" to the stored function name. */
fname = fname_trans_sid(rettv->vval.v_string, fname_buf,
&tofree, &error);
fname = fname_trans_sid(fname, fname_buf, &tofree, &error);
fp = find_func(fname);
vim_free(tofree);
@@ -21758,7 +21753,34 @@ handle_subscript(
pt->pt_refcount = 1;
pt->pt_dict = selfdict;
selfdict = NULL;
pt->pt_name = rettv->vval.v_string;
if (rettv->v_type == VAR_FUNC)
{
/* just a function: use selfdict */
pt->pt_name = rettv->vval.v_string;
}
else
{
partial_T *ret_pt = rettv->vval.v_partial;
int i;
/* partial: use selfdict and copy args */
pt->pt_name = vim_strsave(ret_pt->pt_name);
if (ret_pt->pt_argc > 0)
{
pt->pt_argv = (typval_T *)alloc(
sizeof(typval_T) * ret_pt->pt_argc);
if (pt->pt_argv == NULL)
/* out of memory: drop the arguments */
pt->pt_argc = 0;
else
{
pt->pt_argc = ret_pt->pt_argc;
for (i = 0; i < pt->pt_argc; i++)
copy_tv(&ret_pt->pt_argv[i], &pt->pt_argv[i]);
}
}
partial_unref(ret_pt);
}
func_ref(pt->pt_name);
rettv->v_type = VAR_PARTIAL;
rettv->vval.v_partial = pt;
@@ -23915,6 +23937,8 @@ trans_function_name(
{
name = vim_strsave(lv.ll_tv->vval.v_partial->pt_name);
*pp = end;
if (partial != NULL)
*partial = lv.ll_tv->vval.v_partial;
}
else
{