diff options
| author | Bram Moolenaar <Bram@vim.org> | 2019-08-04 23:04:39 +0200 |
|---|---|---|
| committer | Bram Moolenaar <Bram@vim.org> | 2019-08-04 23:04:39 +0200 |
| commit | fcfe1a9b8950b8b211ab3b24d84b17c6847ea43f (patch) | |
| tree | daeeffb4dd96cdd7744597d9623d222404edd8e2 /src/userfunc.c | |
| parent | 7a4ea1df2f85e00286c49db1145e3a38b35557f4 (diff) | |
| download | vim-git-fcfe1a9b8950b8b211ab3b24d84b17c6847ea43f.tar.gz | |
patch 8.1.1816: cannot use a user defined function as a methodv8.1.1816
Problem: Cannot use a user defined function as a method.
Solution: Pass the base as the first argument to the user defined function
after "->". (partly by FUJIWARA Takuya)
Diffstat (limited to 'src/userfunc.c')
| -rw-r--r-- | src/userfunc.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/src/userfunc.c b/src/userfunc.c index 8e834a3e5..a60919618 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -1495,7 +1495,8 @@ call_func( int argcount = argcount_in; typval_T *argvars = argvars_in; dict_T *selfdict = funcexe->selfdict; - typval_T argv[MAX_FUNC_ARGS + 1]; /* used when "partial" is not NULL */ + typval_T argv[MAX_FUNC_ARGS + 1]; // used when "partial" or + // "funcexe->basetv" is not NULL int argv_clear = 0; partial_T *partial = funcexe->partial; @@ -1554,10 +1555,7 @@ call_func( /* * User defined function. */ - if (funcexe->basetv != NULL) - // TODO: support User function: base->Method() - fp = NULL; - else if (partial != NULL && partial->pt_func != NULL) + if (partial != NULL && partial->pt_func != NULL) fp = partial->pt_func; else fp = find_func(rfname); @@ -1586,6 +1584,16 @@ call_func( argcount = funcexe->argv_func(argcount, argvars, fp->uf_args.ga_len); + if (funcexe->basetv != NULL) + { + // Method call: base->Method() + mch_memmove(&argv[1], argvars, sizeof(typval_T) * argcount); + argv[0] = *funcexe->basetv; + argcount++; + } + else + memcpy(argv, argvars, sizeof(typval_T) * argcount); + if (fp->uf_flags & FC_RANGE && funcexe->doesrange != NULL) *funcexe->doesrange = TRUE; if (argcount < fp->uf_args.ga_len - fp->uf_def_args.ga_len) @@ -1613,7 +1621,7 @@ call_func( did_save_redo = TRUE; } ++fp->uf_calls; - call_user_func(fp, argcount, argvars, rettv, + call_user_func(fp, argcount, argv, rettv, funcexe->firstline, funcexe->lastline, (fp->uf_flags & FC_DICT) ? selfdict : NULL); if (--fp->uf_calls <= 0 && fp->uf_refcount <= 0) @@ -1630,7 +1638,8 @@ call_func( else if (funcexe->basetv != NULL) { /* - * Find the method name in the table, call its implementation. + * expr->method(): Find the method name in the table, call its + * implementation with the base as one of the arguments. */ error = call_internal_method(fname, argcount, argvars, rettv, funcexe->basetv); |
