@@ -145,7 +145,7 @@ struct cctx_S {
145145 int ctx_has_cmdmod ; // ISN_CMDMOD was generated
146146};
147147
148- static void delete_def_function_contents (dfunc_T * dfunc );
148+ static void delete_def_function_contents (dfunc_T * dfunc , int mark_deleted );
149149
150150/*
151151 * Lookup variable "name" in the local scope and return it in "lvar".
@@ -7498,12 +7498,12 @@ compile_def_function(ufunc_T *ufunc, int check_return_type, cctx_T *outer_cctx)
74987498 int new_def_function = FALSE;
74997499
75007500 // When using a function that was compiled before: Free old instructions.
7501- // Otherwise add a new entry in "def_functions".
7501+ // The index is reused. Otherwise add a new entry in "def_functions".
75027502 if (ufunc -> uf_dfunc_idx > 0 )
75037503 {
75047504 dfunc_T * dfunc = ((dfunc_T * )def_functions .ga_data )
75057505 + ufunc -> uf_dfunc_idx ;
7506- delete_def_function_contents (dfunc );
7506+ delete_def_function_contents (dfunc , FALSE );
75077507 }
75087508 else
75097509 {
@@ -8344,7 +8344,7 @@ delete_instr(isn_T *isn)
83448344 * Free all instructions for "dfunc" except df_name.
83458345 */
83468346 static void
8347- delete_def_function_contents (dfunc_T * dfunc )
8347+ delete_def_function_contents (dfunc_T * dfunc , int mark_deleted )
83488348{
83498349 int idx ;
83508350
@@ -8355,9 +8355,13 @@ delete_def_function_contents(dfunc_T *dfunc)
83558355 for (idx = 0 ; idx < dfunc -> df_instr_count ; ++ idx )
83568356 delete_instr (dfunc -> df_instr + idx );
83578357 VIM_CLEAR (dfunc -> df_instr );
8358+ dfunc -> df_instr = NULL ;
83588359 }
83598360
8360- dfunc -> df_deleted = TRUE;
8361+ if (mark_deleted )
8362+ dfunc -> df_deleted = TRUE;
8363+ if (dfunc -> df_ufunc != NULL )
8364+ dfunc -> df_ufunc -> uf_def_status = UF_NOT_COMPILED ;
83618365}
83628366
83638367/*
@@ -8374,7 +8378,7 @@ unlink_def_function(ufunc_T *ufunc)
83748378 + ufunc -> uf_dfunc_idx ;
83758379
83768380 if (-- dfunc -> df_refcount <= 0 )
8377- delete_def_function_contents (dfunc );
8381+ delete_def_function_contents (dfunc , TRUE );
83788382 ufunc -> uf_def_status = UF_NOT_COMPILED ;
83798383 ufunc -> uf_dfunc_idx = 0 ;
83808384 if (dfunc -> df_ufunc == ufunc )
@@ -8410,7 +8414,7 @@ free_def_functions(void)
84108414 {
84118415 dfunc_T * dfunc = ((dfunc_T * )def_functions .ga_data ) + idx ;
84128416
8413- delete_def_function_contents (dfunc );
8417+ delete_def_function_contents (dfunc , TRUE );
84148418 vim_free (dfunc -> df_name );
84158419 }
84168420
0 commit comments