summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-09-22 17:34:01 +0100
committerBram Moolenaar <Bram@vim.org>2022-09-22 17:34:01 +0100
commit5800c798385b4a7eded9ea63cfd4f57d1499a673 (patch)
tree7797bc071600b9c254e37a2dd71465d40216efff
parentf1c60d4bf10794265b828afd9c5f7eddacada10b (diff)
downloadvim-git-5800c798385b4a7eded9ea63cfd4f57d1499a673.tar.gz
patch 9.0.0549: duplicated code in calling a :def functionv9.0.0549
Problem: Duplicated code in calling a :def function. Solution: Simplify the code.
-rw-r--r--src/version.c2
-rw-r--r--src/vim9execute.c34
2 files changed, 14 insertions, 22 deletions
diff --git a/src/version.c b/src/version.c
index 2ad2658d3..e3a3a0e45 100644
--- a/src/version.c
+++ b/src/version.c
@@ -700,6 +700,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 549,
+/**/
548,
/**/
547,
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 9416cf3a3..1699caf49 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -380,7 +380,7 @@ get_pt_outer(partial_T *pt)
* Call compiled function "cdf_idx" from compiled code.
* This adds a stack frame and sets the instruction pointer to the start of the
* called function.
- * If "pt" is not null use "pt->pt_outer" for ec_outer_ref->or_outer.
+ * If "pt_arg" is not NULL use "pt_arg->pt_outer" for ec_outer_ref->or_outer.
*
* Stack has:
* - current arguments (already there)
@@ -394,7 +394,7 @@ get_pt_outer(partial_T *pt)
static int
call_dfunc(
int cdf_idx,
- partial_T *pt,
+ partial_T *pt_arg,
int argcount_arg,
ectx_T *ectx)
{
@@ -543,27 +543,21 @@ call_dfunc(
STACK_TV_BOT(STACK_FRAME_IDX_OFF)->vval.v_number = ectx->ec_frame_idx;
ectx->ec_frame_idx = ectx->ec_stack.ga_len;
- // Initialize local variables
- for (idx = 0; idx < dfunc->df_varcount; ++idx)
+ // Initialize all local variables to number zero. Also initialize the
+ // variable that counts how many closures were created. This is used in
+ // handle_closure_in_use().
+ int initcount = dfunc->df_varcount + (dfunc->df_has_closure ? 1 : 0);
+ for (idx = 0; idx < initcount; ++idx)
{
typval_T *tv = STACK_TV_BOT(STACK_FRAME_SIZE + idx);
tv->v_type = VAR_NUMBER;
tv->vval.v_number = 0;
}
- if (dfunc->df_has_closure)
- {
- typval_T *tv = STACK_TV_BOT(STACK_FRAME_SIZE + dfunc->df_varcount);
-
- // Initialize the variable that counts how many closures were created.
- // This is used in handle_closure_in_use().
- tv->v_type = VAR_NUMBER;
- tv->vval.v_number = 0;
- }
ectx->ec_stack.ga_len += STACK_FRAME_SIZE + varcount;
- if (pt != NULL || ufunc->uf_partial != NULL
- || (ufunc->uf_flags & FC_CLOSURE))
+ partial_T *pt = pt_arg != NULL ? pt_arg : ufunc->uf_partial;
+ if (pt != NULL || (ufunc->uf_flags & FC_CLOSURE))
{
outer_ref_T *ref = ALLOC_CLEAR_ONE(outer_ref_T);
@@ -575,12 +569,6 @@ call_dfunc(
++pt->pt_refcount;
ref->or_partial = pt;
}
- else if (ufunc->uf_partial != NULL)
- {
- ref->or_outer = get_pt_outer(ufunc->uf_partial);
- ++ufunc->uf_partial->pt_refcount;
- ref->or_partial = ufunc->uf_partial;
- }
else
{
ref->or_outer = ALLOC_CLEAR_ONE(outer_T);
@@ -5832,7 +5820,9 @@ call_def_function(
ectx.ec_where.wt_index = 0;
ectx.ec_where.wt_variable = FALSE;
- // Execute the instructions until done.
+ /*
+ * Execute the instructions until done.
+ */
ret = exec_instructions(&ectx);
if (ret == OK)
{