changeset 30427:4198995b9210 v9.0.0549

patch 9.0.0549: duplicated code in calling a :def function Commit: https://github.com/vim/vim/commit/5800c798385b4a7eded9ea63cfd4f57d1499a673 Author: Bram Moolenaar <Bram@vim.org> Date: Thu Sep 22 17:34:01 2022 +0100 patch 9.0.0549: duplicated code in calling a :def function Problem: Duplicated code in calling a :def function. Solution: Simplify the code.
author Bram Moolenaar <Bram@vim.org>
date Thu, 22 Sep 2022 18:45:03 +0200
parents d083c8d6f256
children e57e07951f98
files src/version.c src/vim9execute.c
diffstat 2 files changed, 14 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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,
--- 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)
     {