# HG changeset patch # User Bram Moolenaar # Date 1625323503 -7200 # Node ID 80cab530472b5ec2d5379b0d64f2a4739168be1d # Parent 1d9412cd0dee334fe1093f5b07679e3bed9f9319 patch 8.2.3089: garbage collection has useless code Commit: https://github.com/vim/vim/commit/20cc52832067d22a3cd47dfb0805251228c32e7d Author: Bram Moolenaar Date: Sat Jul 3 16:33:16 2021 +0200 patch 8.2.3089: garbage collection has useless code Problem: Garbage collection has useless code. Solution: Bail out when aborting. (closes https://github.com/vim/vim/issues/8504) diff --git a/src/userfunc.c b/src/userfunc.c --- a/src/userfunc.c +++ b/src/userfunc.c @@ -5478,35 +5478,32 @@ find_var_in_scoped_ht(char_u *name, int int set_ref_in_previous_funccal(int copyID) { - int abort = FALSE; funccall_T *fc; - for (fc = previous_funccal; !abort && fc != NULL; fc = fc->caller) + for (fc = previous_funccal; fc != NULL; fc = fc->caller) { fc->fc_copyID = copyID + 1; - abort = abort - || set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1, NULL) - || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID + 1, NULL) - || set_ref_in_list_items(&fc->l_varlist, copyID + 1, NULL); + if (set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID + 1, NULL) + || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID + 1, NULL) + || set_ref_in_list_items(&fc->l_varlist, copyID + 1, NULL)) + return TRUE; } - return abort; + return FALSE; } static int set_ref_in_funccal(funccall_T *fc, int copyID) { - int abort = FALSE; - if (fc->fc_copyID != copyID) { fc->fc_copyID = copyID; - abort = abort - || set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID, NULL) - || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID, NULL) - || set_ref_in_list_items(&fc->l_varlist, copyID, NULL) - || set_ref_in_func(NULL, fc->func, copyID); + if (set_ref_in_ht(&fc->l_vars.dv_hashtab, copyID, NULL) + || set_ref_in_ht(&fc->l_avars.dv_hashtab, copyID, NULL) + || set_ref_in_list_items(&fc->l_varlist, copyID, NULL) + || set_ref_in_func(NULL, fc->func, copyID)) + return TRUE; } - return abort; + return FALSE; } /* @@ -5515,19 +5512,19 @@ set_ref_in_funccal(funccall_T *fc, int c int set_ref_in_call_stack(int copyID) { - int abort = FALSE; funccall_T *fc; funccal_entry_T *entry; - for (fc = current_funccal; !abort && fc != NULL; fc = fc->caller) - abort = abort || set_ref_in_funccal(fc, copyID); + for (fc = current_funccal; fc != NULL; fc = fc->caller) + if (set_ref_in_funccal(fc, copyID)) + return TRUE; // Also go through the funccal_stack. - for (entry = funccal_stack; !abort && entry != NULL; entry = entry->next) - for (fc = entry->top_funccal; !abort && fc != NULL; fc = fc->caller) - abort = abort || set_ref_in_funccal(fc, copyID); - - return abort; + for (entry = funccal_stack; entry != NULL; entry = entry->next) + for (fc = entry->top_funccal; fc != NULL; fc = fc->caller) + if (set_ref_in_funccal(fc, copyID)) + return TRUE; + return FALSE; } /* @@ -5538,7 +5535,6 @@ set_ref_in_functions(int copyID) { int todo; hashitem_T *hi = NULL; - int abort = FALSE; ufunc_T *fp; todo = (int)func_hashtab.ht_used; @@ -5548,11 +5544,12 @@ set_ref_in_functions(int copyID) { --todo; fp = HI2UF(hi); - if (!func_name_refcount(fp->uf_name)) - abort = abort || set_ref_in_func(NULL, fp, copyID); + if (!func_name_refcount(fp->uf_name) + && set_ref_in_func(NULL, fp, copyID)) + return TRUE; } } - return abort; + return FALSE; } /* @@ -5562,12 +5559,12 @@ set_ref_in_functions(int copyID) set_ref_in_func_args(int copyID) { int i; - int abort = FALSE; for (i = 0; i < funcargs.ga_len; ++i) - abort = abort || set_ref_in_item(((typval_T **)funcargs.ga_data)[i], - copyID, NULL, NULL); - return abort; + if (set_ref_in_item(((typval_T **)funcargs.ga_data)[i], + copyID, NULL, NULL)) + return TRUE; + return FALSE; } /* diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -756,6 +756,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 3089, +/**/ 3088, /**/ 3087,