/* vim9execute.c */
-int call_def_function(ufunc_T *ufunc, int argc_arg, typval_T *argv, typval_T *rettv);
+int call_def_function(ufunc_T *ufunc, int argc_arg, typval_T *argv, partial_T *partial, typval_T *rettv);
void ex_disassemble(exarg_T *eap);
int tv2bool(typval_T *tv);
int check_not_string(typval_T *tv);
-int set_ref_in_dfunc(ufunc_T *ufunc, int copyID);
/* vim: set ft=c : */
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;
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;
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)
{
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);
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)
{
ufunc_T *ufunc,
int argc_arg, // nr of arguments
typval_T *argv, // arguments
+ partial_T *partial, // optional partial for context
typval_T *rettv) // return value
{
ectx_T ectx; // execution context
ectx.ec_frame_idx = ectx.ec_stack.ga_len;
initial_frame_idx = ectx.ec_frame_idx;
+ if (partial != NULL)
+ {
+ ectx.ec_outer_stack = partial->pt_ectx_stack;
+ ectx.ec_outer_frame = partial->pt_ectx_frame;
+ }
+
// dummy frame entries
for (idx = 0; idx < STACK_FRAME_SIZE; ++idx)
{
{
cpfunc_T *pfunc = &iptr->isn_arg.pfunc;
int r;
- typval_T partial;
+ typval_T partial_tv;
SOURCING_LNUM = iptr->isn_lnum;
if (pfunc->cpf_top)
{
// Get the funcref from the stack.
--ectx.ec_stack.ga_len;
- partial = *STACK_TV_BOT(0);
- tv = &partial;
+ partial_tv = *STACK_TV_BOT(0);
+ tv = &partial_tv;
}
r = call_partial(tv, pfunc->cpf_argcount, &ectx);
- if (tv == &partial)
- clear_tv(&partial);
+ if (tv == &partial_tv)
+ clear_tv(&partial_tv);
if (r == FAIL)
goto failed;
}