To: vim_dev@googlegroups.com Subject: Patch 8.2.4431 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///