Patch 8.2.4431
Problem:    Unnecessary condition when assigning to a variable.
Solution:   Remove the condition.
Files:      src/evalvars.c


*** ../vim-8.2.4430/src/evalvars.c      2022-02-20 20:48:53.226071796 +0000
--- src/evalvars.c      2022-02-21 15:55:40.352357708 +0000
***************
*** 3409,3415 ****
      type_T    *type = type_arg;
      typval_T  bool_tv;
      dictitem_T        *di;
!     typval_T  *dest_tv = NULL;
      char_u    *varname;
      char_u    *name_tofree = NULL;
      hashtab_T *ht = NULL;
--- 3409,3415 ----
      type_T    *type = type_arg;
      typval_T  bool_tv;
      dictitem_T        *di;
!     typval_T  *dest_tv;
      char_u    *varname;
      char_u    *name_tofree = NULL;
      hashtab_T *ht = NULL;
***************
*** 3503,3687 ****
        }
      }
  
!     if (dest_tv == NULL)
!     {
!       // Search in parent scope which is possible to reference from lambda
!       if (di == NULL)
!           di = find_var_in_scoped_ht(name, TRUE);
  
!       if ((tv->v_type == VAR_FUNC || tv->v_type == VAR_PARTIAL)
!                                     && var_wrong_func_name(name, di == NULL))
!           goto failed;
  
!       if (need_convert_to_bool(type, tv))
!       {
!           // Destination is a bool and the value is not, but it can be
!           // converted.
!           CLEAR_FIELD(bool_tv);
!           bool_tv.v_type = VAR_BOOL;
!           bool_tv.vval.v_number = tv2bool(tv) ? VVAL_TRUE : VVAL_FALSE;
!           tv = &bool_tv;
!       }
  
!       if (di != NULL)
        {
!           // Item already exists.  Allowed to replace when reloading.
!           if ((di->di_flags & DI_FLAGS_RELOAD) == 0)
            {
!               if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
!                                            && (flags & ASSIGN_FOR_LOOP) == 0)
!               {
!                   emsg(_(e_cannot_modify_existing_variable));
!                   goto failed;
!               }
! 
!               if (is_script_local && vim9script
!                             && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0)
!               {
!                   semsg(_(e_redefining_script_item_str), name);
!                   goto failed;
!               }
! 
!               if (var_in_vim9script && (flags & ASSIGN_FOR_LOOP) == 0)
!               {
!                   where_T where = WHERE_INIT;
!                   svar_T  *sv = find_typval_in_script(&di->di_tv, sid);
! 
!                   if (sv != NULL)
!                   {
!                       // check the type and adjust to bool if needed
!                       where.wt_index = var_idx;
!                       where.wt_variable = TRUE;
!                       if (check_script_var_type(sv, tv, name, where) == FAIL)
!                           goto failed;
!                       if (type == NULL)
!                           type = sv->sv_type;
!                   }
!               }
! 
!               if ((flags & ASSIGN_FOR_LOOP) == 0
!                                    && var_check_permission(di, name) == FAIL)
!                   goto failed;
            }
-           else
-           {
-               // can only redefine once
-               di->di_flags &= ~DI_FLAGS_RELOAD;
  
!               // A Vim9 script-local variable is also present in sn_all_vars
!               // and sn_var_vals.  It may set "type" from "tv".
!               if (var_in_vim9script || var_in_autoload)
!                   update_vim9_script_var(FALSE, di,
!                           var_in_autoload ? name : di->di_key, flags,
!                           tv, &type, (flags & ASSIGN_NO_MEMBER_TYPE) == 0);
            }
  
!           // existing variable, need to clear the value
! 
!           // Handle setting internal di: variables separately where needed to
!           // prevent changing the type.
!           if (ht == &vimvarht)
            {
!               if (di->di_tv.v_type == VAR_STRING)
!               {
!                   VIM_CLEAR(di->di_tv.vval.v_string);
!                   if (copy || tv->v_type != VAR_STRING)
!                   {
!                       char_u *val = tv_get_string(tv);
! 
!                       // Careful: when assigning to v:errmsg and
!                       // tv_get_string() causes an error message the variable
!                       // will already be set.
!                       if (di->di_tv.vval.v_string == NULL)
!                           di->di_tv.vval.v_string = vim_strsave(val);
!                   }
!                   else
!                   {
!                       // Take over the string to avoid an extra alloc/free.
!                       di->di_tv.vval.v_string = tv->vval.v_string;
!                       tv->vval.v_string = NULL;
!                   }
!                   goto failed;
!               }
!               else if (di->di_tv.v_type == VAR_NUMBER)
!               {
!                   di->di_tv.vval.v_number = tv_get_number(tv);
!                   if (STRCMP(varname, "searchforward") == 0)
!                       set_search_direction(di->di_tv.vval.v_number
!                                                                 ? '/' : '?');
! #ifdef FEAT_SEARCH_EXTRA
!                   else if (STRCMP(varname, "hlsearch") == 0)
!                   {
!                       no_hlsearch = !di->di_tv.vval.v_number;
!                       redraw_all_later(SOME_VALID);
!                   }
! #endif
!                   goto failed;
!               }
!               else if (di->di_tv.v_type != tv->v_type)
                {
!                   semsg(_(e_setting_str_to_value_with_wrong_type), name);
!                   goto failed;
                }
            }
  
!           clear_tv(&di->di_tv);
        }
        else
        {
!           // Item not found, check if a function already exists.
!           if (is_script_local && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
!                  && lookup_scriptitem(name, STRLEN(name), FALSE, NULL) == OK)
            {
!               semsg(_(e_redefining_script_item_str), name);
                goto failed;
            }
! 
!           // add a new variable
!           if (var_in_vim9script && (flags & ASSIGN_NO_DECL))
            {
!               semsg(_(e_unknown_variable_str), name);
                goto failed;
            }
! 
!           // Can't add "v:" or "a:" variable.
!           if (ht == &vimvarht || ht == get_funccal_args_ht())
            {
!               semsg(_(e_illegal_variable_name_str), name);
                goto failed;
            }
  
!           // Make sure the variable name is valid.  In Vim9 script an
!           // autoload variable must be prefixed with "g:" unless in an
!           // autoload script.
!           if (!valid_varname(varname, -1, !vim9script
!                           || STRNCMP(name, "g:", 2) == 0 || var_in_autoload))
!               goto failed;
  
!           di = alloc(sizeof(dictitem_T) + STRLEN(varname));
!           if (di == NULL)
!               goto failed;
!           STRCPY(di->di_key, varname);
!           if (hash_add(ht, DI2HIKEY(di)) == FAIL)
!           {
!               vim_free(di);
!               goto failed;
!           }
!           di->di_flags = DI_FLAGS_ALLOC;
!           if (flags & (ASSIGN_CONST | ASSIGN_FINAL))
!               di->di_flags |= DI_FLAGS_LOCK;
  
!           // A Vim9 script-local variable is also added to sn_all_vars and
!           // sn_var_vals. It may set "type" from "tv".
!           if (var_in_vim9script || var_in_autoload)
!               update_vim9_script_var(TRUE, di,
!                       var_in_autoload ? name : di->di_key, flags,
!                             tv, &type, (flags & ASSIGN_NO_MEMBER_TYPE) == 0);
        }
  
!       dest_tv = &di->di_tv;
      }
  
      if (copy || tv->v_type == VAR_NUMBER || tv->v_type == VAR_FLOAT)
        copy_tv(tv, dest_tv);
      else
--- 3503,3683 ----
        }
      }
  
!     // Search in parent scope which is possible to reference from lambda
!     if (di == NULL)
!       di = find_var_in_scoped_ht(name, TRUE);
  
!     if ((tv->v_type == VAR_FUNC || tv->v_type == VAR_PARTIAL)
!                                 && var_wrong_func_name(name, di == NULL))
!       goto failed;
  
!     if (need_convert_to_bool(type, tv))
!     {
!       // Destination is a bool and the value is not, but it can be
!       // converted.
!       CLEAR_FIELD(bool_tv);
!       bool_tv.v_type = VAR_BOOL;
!       bool_tv.vval.v_number = tv2bool(tv) ? VVAL_TRUE : VVAL_FALSE;
!       tv = &bool_tv;
!     }
  
!     if (di != NULL)
!     {
!       // Item already exists.  Allowed to replace when reloading.
!       if ((di->di_flags & DI_FLAGS_RELOAD) == 0)
        {
!           if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
!                                        && (flags & ASSIGN_FOR_LOOP) == 0)
            {
!               emsg(_(e_cannot_modify_existing_variable));
!               goto failed;
            }
  
!           if (is_script_local && vim9script
!                         && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0)
!           {
!               semsg(_(e_redefining_script_item_str), name);
!               goto failed;
            }
  
!           if (var_in_vim9script && (flags & ASSIGN_FOR_LOOP) == 0)
            {
!               where_T where = WHERE_INIT;
!               svar_T  *sv = find_typval_in_script(&di->di_tv, sid);
! 
!               if (sv != NULL)
                {
!                   // check the type and adjust to bool if needed
!                   where.wt_index = var_idx;
!                   where.wt_variable = TRUE;
!                   if (check_script_var_type(sv, tv, name, where) == FAIL)
!                       goto failed;
!                   if (type == NULL)
!                       type = sv->sv_type;
                }
            }
  
!           if ((flags & ASSIGN_FOR_LOOP) == 0
!                                && var_check_permission(di, name) == FAIL)
!               goto failed;
        }
        else
        {
!           // can only redefine once
!           di->di_flags &= ~DI_FLAGS_RELOAD;
! 
!           // A Vim9 script-local variable is also present in sn_all_vars
!           // and sn_var_vals.  It may set "type" from "tv".
!           if (var_in_vim9script || var_in_autoload)
!               update_vim9_script_var(FALSE, di,
!                       var_in_autoload ? name : di->di_key, flags,
!                       tv, &type, (flags & ASSIGN_NO_MEMBER_TYPE) == 0);
!       }
! 
!       // existing variable, need to clear the value
! 
!       // Handle setting internal di: variables separately where needed to
!       // prevent changing the type.
!       if (ht == &vimvarht)
!       {
!           if (di->di_tv.v_type == VAR_STRING)
            {
!               VIM_CLEAR(di->di_tv.vval.v_string);
!               if (copy || tv->v_type != VAR_STRING)
!               {
!                   char_u *val = tv_get_string(tv);
! 
!                   // Careful: when assigning to v:errmsg and
!                   // tv_get_string() causes an error message the variable
!                   // will already be set.
!                   if (di->di_tv.vval.v_string == NULL)
!                       di->di_tv.vval.v_string = vim_strsave(val);
!               }
!               else
!               {
!                   // Take over the string to avoid an extra alloc/free.
!                   di->di_tv.vval.v_string = tv->vval.v_string;
!                   tv->vval.v_string = NULL;
!               }
                goto failed;
            }
!           else if (di->di_tv.v_type == VAR_NUMBER)
            {
!               di->di_tv.vval.v_number = tv_get_number(tv);
!               if (STRCMP(varname, "searchforward") == 0)
!                   set_search_direction(di->di_tv.vval.v_number
!                                                             ? '/' : '?');
! #ifdef FEAT_SEARCH_EXTRA
!               else if (STRCMP(varname, "hlsearch") == 0)
!               {
!                   no_hlsearch = !di->di_tv.vval.v_number;
!                   redraw_all_later(SOME_VALID);
!               }
! #endif
                goto failed;
            }
!           else if (di->di_tv.v_type != tv->v_type)
            {
!               semsg(_(e_setting_str_to_value_with_wrong_type), name);
                goto failed;
            }
+       }
  
!       clear_tv(&di->di_tv);
!     }
!     else
!     {
!       // Item not found, check if a function already exists.
!       if (is_script_local && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
!              && lookup_scriptitem(name, STRLEN(name), FALSE, NULL) == OK)
!       {
!           semsg(_(e_redefining_script_item_str), name);
!           goto failed;
!       }
  
!       // add a new variable
!       if (var_in_vim9script && (flags & ASSIGN_NO_DECL))
!       {
!           semsg(_(e_unknown_variable_str), name);
!           goto failed;
!       }
  
!       // Can't add "v:" or "a:" variable.
!       if (ht == &vimvarht || ht == get_funccal_args_ht())
!       {
!           semsg(_(e_illegal_variable_name_str), name);
!           goto failed;
        }
  
!       // Make sure the variable name is valid.  In Vim9 script an
!       // autoload variable must be prefixed with "g:" unless in an
!       // autoload script.
!       if (!valid_varname(varname, -1, !vim9script
!                       || STRNCMP(name, "g:", 2) == 0 || var_in_autoload))
!           goto failed;
! 
!       di = alloc(sizeof(dictitem_T) + STRLEN(varname));
!       if (di == NULL)
!           goto failed;
!       STRCPY(di->di_key, varname);
!       if (hash_add(ht, DI2HIKEY(di)) == FAIL)
!       {
!           vim_free(di);
!           goto failed;
!       }
!       di->di_flags = DI_FLAGS_ALLOC;
!       if (flags & (ASSIGN_CONST | ASSIGN_FINAL))
!           di->di_flags |= DI_FLAGS_LOCK;
! 
!       // A Vim9 script-local variable is also added to sn_all_vars and
!       // sn_var_vals. It may set "type" from "tv".
!       if (var_in_vim9script || var_in_autoload)
!           update_vim9_script_var(TRUE, di,
!                   var_in_autoload ? name : di->di_key, flags,
!                         tv, &type, (flags & ASSIGN_NO_MEMBER_TYPE) == 0);
      }
  
+     dest_tv = &di->di_tv;
      if (copy || tv->v_type == VAR_NUMBER || tv->v_type == VAR_FLOAT)
        copy_tv(tv, dest_tv);
      else
*** ../vim-8.2.4430/src/version.c       2022-02-21 15:07:07.777267539 +0000
--- src/version.c       2022-02-21 15:58:33.544043173 +0000
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     4431,
  /**/

-- 
>From "know your smileys":
¯\_(ツ)_/¯   Shrug

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220221160016.8E4E11C0FE0%40moolenaar.net.

Raspunde prin e-mail lui