To: vim_dev@googlegroups.com Subject: Patch 8.2.4682 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4682 Problem: Vim9: can use :unlockvar for const variable. (Ernie Rael) Solution: Check whether the variable is a const. Files: src/ex_docmd.c, src/evalvars.c, src/vim9script.c, src/proto/vim9script.pro, src/eval.c, src/userfunc.c, src/testdir/test_vim9_cmd.vim *** ../vim-8.2.4681/src/ex_docmd.c 2022-03-31 11:37:54.259367941 +0100 --- src/ex_docmd.c 2022-04-04 13:51:14.849756816 +0100 *************** *** 303,309 **** # define ex_throw ex_ni # define ex_try ex_ni # define ex_unlet ex_ni - # define ex_unlockvar ex_ni # define ex_while ex_ni # define ex_import ex_ni # define ex_export ex_ni --- 303,308 ---- *** ../vim-8.2.4681/src/evalvars.c 2022-04-01 15:26:54.984558728 +0100 --- src/evalvars.c 2022-04-04 14:27:57.000696536 +0100 *************** *** 1951,1973 **** lp->ll_name); ret = FAIL; } - else if ((di->di_flags & DI_FLAGS_FIX) - && di->di_tv.v_type != VAR_DICT - && di->di_tv.v_type != VAR_LIST) - { - // For historic reasons this error is not given for a list or - // dict. E.g., the b: dict could be locked/unlocked. - semsg(_(e_cannot_lock_or_unlock_variable_str), lp->ll_name); - ret = FAIL; - } else { ! if (lock) ! di->di_flags |= DI_FLAGS_LOCK; else ! di->di_flags &= ~DI_FLAGS_LOCK; ! if (deep != 0) ! item_lock(&di->di_tv, deep, lock, FALSE); } } *name_end = cc; --- 1951,1992 ---- lp->ll_name); ret = FAIL; } else { ! if ((di->di_flags & DI_FLAGS_FIX) ! && di->di_tv.v_type != VAR_DICT ! && di->di_tv.v_type != VAR_LIST) ! { ! // For historic reasons this error is not given for a list ! // or dict. E.g., the b: dict could be locked/unlocked. ! semsg(_(e_cannot_lock_or_unlock_variable_str), lp->ll_name); ! ret = FAIL; ! } else ! { ! if (in_vim9script()) ! { ! svar_T *sv = find_typval_in_script(&di->di_tv, ! 0, FALSE); ! ! if (sv != NULL && sv->sv_const != 0) ! { ! semsg(_(e_cannot_change_readonly_variable_str), ! lp->ll_name); ! ret = FAIL; ! } ! } ! ! if (ret == OK) ! { ! if (lock) ! di->di_flags |= DI_FLAGS_LOCK; ! else ! di->di_flags &= ~DI_FLAGS_LOCK; ! if (deep != 0) ! item_lock(&di->di_tv, deep, lock, FALSE); ! } ! } } } *name_end = cc; *************** *** 2812,2818 **** if (ht != NULL && ht == get_script_local_ht() && tv != &SCRIPT_SV(current_sctx.sc_sid)->sv_var.di_tv) { ! svar_T *sv = find_typval_in_script(tv, 0); if (sv != NULL) type = sv->sv_type; --- 2831,2837 ---- if (ht != NULL && ht == get_script_local_ht() && tv != &SCRIPT_SV(current_sctx.sc_sid)->sv_var.di_tv) { ! svar_T *sv = find_typval_in_script(tv, 0, TRUE); if (sv != NULL) type = sv->sv_type; *************** *** 3557,3563 **** 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) { --- 3576,3582 ---- 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, TRUE); if (sv != NULL) { *** ../vim-8.2.4681/src/vim9script.c 2022-03-31 16:18:19.916278625 +0100 --- src/vim9script.c 2022-04-04 14:28:35.032682564 +0100 *************** *** 956,962 **** } else { ! sv = find_typval_in_script(&di->di_tv, 0); } if (sv != NULL) { --- 956,962 ---- } else { ! sv = find_typval_in_script(&di->di_tv, 0, TRUE); } if (sv != NULL) { *************** *** 1053,1062 **** /* * Find the script-local variable that links to "dest". * If "sid" is zero use the current script. * Returns NULL if not found and give an internal error. */ svar_T * ! find_typval_in_script(typval_T *dest, scid_T sid) { scriptitem_T *si = SCRIPT_ITEM(sid == 0 ? current_sctx.sc_sid : sid); int idx; --- 1053,1063 ---- /* * Find the script-local variable that links to "dest". * If "sid" is zero use the current script. + * if "must_find" is TRUE and "dest" cannot be found report an internal error. * Returns NULL if not found and give an internal error. */ svar_T * ! find_typval_in_script(typval_T *dest, scid_T sid, int must_find) { scriptitem_T *si = SCRIPT_ITEM(sid == 0 ? current_sctx.sc_sid : sid); int idx; *************** *** 1076,1082 **** if (sv->sv_name != NULL && sv->sv_tv == dest) return sv; } ! iemsg("find_typval_in_script(): not found"); return NULL; } --- 1077,1084 ---- if (sv->sv_name != NULL && sv->sv_tv == dest) return sv; } ! if (must_find) ! iemsg("find_typval_in_script(): not found"); return NULL; } *** ../vim-8.2.4681/src/proto/vim9script.pro 2022-03-22 12:13:49.151376708 +0000 --- src/proto/vim9script.pro 2022-04-04 14:26:56.076719543 +0100 *************** *** 16,22 **** char_u *vim9_declare_scriptvar(exarg_T *eap, char_u *arg); void update_vim9_script_var(int create, dictitem_T *di, char_u *name, int flags, typval_T *tv, type_T **type, int do_member); void hide_script_var(scriptitem_T *si, int idx, int func_defined); ! svar_T *find_typval_in_script(typval_T *dest, scid_T sid); int check_script_var_type(svar_T *sv, typval_T *value, char_u *name, where_T where); int check_reserved_name(char_u *name); /* vim: set ft=c : */ --- 16,22 ---- char_u *vim9_declare_scriptvar(exarg_T *eap, char_u *arg); void update_vim9_script_var(int create, dictitem_T *di, char_u *name, int flags, typval_T *tv, type_T **type, int do_member); void hide_script_var(scriptitem_T *si, int idx, int func_defined); ! svar_T *find_typval_in_script(typval_T *dest, scid_T sid, int must_find); int check_script_var_type(svar_T *sv, typval_T *value, char_u *name, where_T where); int check_reserved_name(char_u *name); /* vim: set ft=c : */ *** ../vim-8.2.4681/src/eval.c 2022-04-01 15:26:54.984558728 +0100 --- src/eval.c 2022-04-04 14:27:14.076712659 +0100 *************** *** 1065,1071 **** && lp->ll_tv == &v->di_tv && ht != NULL && ht == get_script_local_ht()) { ! svar_T *sv = find_typval_in_script(lp->ll_tv, 0); // Vim9 script local variable: get the type if (sv != NULL) --- 1065,1071 ---- && lp->ll_tv == &v->di_tv && ht != NULL && ht == get_script_local_ht()) { ! svar_T *sv = find_typval_in_script(lp->ll_tv, 0, TRUE); // Vim9 script local variable: get the type if (sv != NULL) *** ../vim-8.2.4681/src/userfunc.c 2022-03-31 21:40:28.889186407 +0100 --- src/userfunc.c 2022-04-04 14:28:03.432694153 +0100 *************** *** 1697,1703 **** { if (!did_type && type != NULL && ht == get_script_local_ht()) { ! svar_T *sv = find_typval_in_script(tv, 0); if (sv != NULL) *type = sv->sv_type; --- 1697,1703 ---- { if (!did_type && type != NULL && ht == get_script_local_ht()) { ! svar_T *sv = find_typval_in_script(tv, 0, TRUE); if (sv != NULL) *type = sv->sv_type; *** ../vim-8.2.4681/src/testdir/test_vim9_cmd.vim 2022-04-03 21:11:31.031579240 +0100 --- src/testdir/test_vim9_cmd.vim 2022-04-04 14:29:42.220658476 +0100 *************** *** 1650,1655 **** --- 1650,1672 ---- LockIt() END v9.CheckScriptFailure(lines, 'E1246', 1) + + lines =<< trim END + vim9script + const name = 'john' + unlockvar name + END + v9.CheckScriptFailure(lines, 'E46', 3) + + lines =<< trim END + vim9script + const name = 'john' + def UnLockIt() + unlockvar name + enddef + UnLockIt() + END + v9.CheckScriptFailure(lines, 'E46', 1) enddef def Test_substitute_expr() *** ../vim-8.2.4681/src/version.c 2022-04-03 21:57:22.517883893 +0100 --- src/version.c 2022-04-04 13:57:43.533910489 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4682, /**/ -- It is illegal for a driver to be blindfolded while operating a vehicle. [real standing law in Alabama, United States of America] /// 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 ///