summaryrefslogtreecommitdiff
path: root/src/userfunc.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-05-16 21:20:12 +0200
committerBram Moolenaar <Bram@vim.org>2020-05-16 21:20:12 +0200
commit6f5b6dfb16228c0ce1e4379b7bafed02eaddbab2 (patch)
tree5ef46ff7e270b67cf076b0797e66bdb016e35ae7 /src/userfunc.c
parentaa5fc4ec51b00e91f174ac83c8ff68becf5f42bb (diff)
downloadvim-git-6f5b6dfb16228c0ce1e4379b7bafed02eaddbab2.tar.gz
patch 8.2.0771: Vim9: cannot call a compiled closure from not compiled codev8.2.0771
Problem: Vim9: cannot call a compiled closure from not compiled code. Solution: Pass funcexe to call_user_func().
Diffstat (limited to 'src/userfunc.c')
-rw-r--r--src/userfunc.c16
1 files changed, 7 insertions, 9 deletions
diff --git a/src/userfunc.c b/src/userfunc.c
index b3c4f900a..99c45b3e7 100644
--- a/src/userfunc.c
+++ b/src/userfunc.c
@@ -1062,8 +1062,7 @@ call_user_func(
int argcount, // nr of args
typval_T *argvars, // arguments
typval_T *rettv, // return value
- linenr_T firstline, // first line of range
- linenr_T lastline, // last line of range
+ funcexe_T *funcexe, // context
dict_T *selfdict) // Dictionary for "self"
{
sctx_T save_current_sctx;
@@ -1120,7 +1119,7 @@ call_user_func(
current_sctx = fp->uf_script_ctx;
// Execute the compiled function.
- call_def_function(fp, argcount, argvars, rettv);
+ call_def_function(fp, argcount, argvars, funcexe->partial, rettv);
--depth;
current_funccal = fc->caller;
@@ -1194,9 +1193,9 @@ call_user_func(
if ((fp->uf_flags & FC_NOARGS) == 0)
{
add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "firstline",
- (varnumber_T)firstline);
+ (varnumber_T)funcexe->firstline);
add_nr_var(&fc->l_avars, &fc->fixvar[fixvar_idx++].var, "lastline",
- (varnumber_T)lastline);
+ (varnumber_T)funcexe->lastline);
}
for (i = 0; i < argcount || i < fp->uf_args.ga_len; ++i)
{
@@ -1515,9 +1514,8 @@ call_user_func_check(
did_save_redo = TRUE;
}
++fp->uf_calls;
- call_user_func(fp, argcount, argvars, rettv,
- funcexe->firstline, funcexe->lastline,
- (fp->uf_flags & FC_DICT) ? selfdict : NULL);
+ call_user_func(fp, argcount, argvars, rettv, funcexe,
+ (fp->uf_flags & FC_DICT) ? selfdict : NULL);
if (--fp->uf_calls <= 0 && fp->uf_refcount <= 0)
// Function was unreferenced while being used, free it now.
func_clear_free(fp, FALSE);
@@ -4293,7 +4291,7 @@ find_hi_in_scoped_ht(char_u *name, hashtab_T **pht)
if (current_funccal == NULL || current_funccal->func->uf_scoped == NULL)
return NULL;
- // Search in parent scope which is possible to reference from lambda
+ // Search in parent scope, which can be referenced from a lambda.
current_funccal = current_funccal->func->uf_scoped;
while (current_funccal != NULL)
{