comparison src/evalvars.c @ 22298:07e48ee8c3bb v8.2.1698

patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9 Commit: https://github.com/vim/vim/commit/a187c43cfe8863d48b2159d695fedcb71f8525c1 Author: Bram Moolenaar <Bram@vim.org> Date: Wed Sep 16 21:08:28 2020 +0200 patch 8.2.1698: cannot lock a variable in legacy Vim script like in Vim9 Problem: Cannot lock a variable in legacy Vim script like in Vim9. Solution: Make ":lockvar 0" work.
author Bram Moolenaar <Bram@vim.org>
date Wed, 16 Sep 2020 21:15:05 +0200
parents eb1f5f618c75
children a9fb7efa31d6
comparison
equal deleted inserted replaced
22297:3d2dc70119a7 22298:07e48ee8c3bb
1558 else if (do_unlet(lp->ll_name, forceit) == FAIL) 1558 else if (do_unlet(lp->ll_name, forceit) == FAIL)
1559 ret = FAIL; 1559 ret = FAIL;
1560 *name_end = cc; 1560 *name_end = cc;
1561 } 1561 }
1562 else if ((lp->ll_list != NULL 1562 else if ((lp->ll_list != NULL
1563 && var_check_lock(lp->ll_list->lv_lock, lp->ll_name, FALSE)) 1563 && value_check_lock(lp->ll_list->lv_lock, lp->ll_name, FALSE))
1564 || (lp->ll_dict != NULL 1564 || (lp->ll_dict != NULL
1565 && var_check_lock(lp->ll_dict->dv_lock, lp->ll_name, FALSE))) 1565 && value_check_lock(lp->ll_dict->dv_lock, lp->ll_name, FALSE)))
1566 return FAIL; 1566 return FAIL;
1567 else if (lp->ll_range) 1567 else if (lp->ll_range)
1568 { 1568 {
1569 listitem_T *li; 1569 listitem_T *li;
1570 listitem_T *ll_li = lp->ll_li; 1570 listitem_T *ll_li = lp->ll_li;
1571 int ll_n1 = lp->ll_n1; 1571 int ll_n1 = lp->ll_n1;
1572 1572
1573 while (ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= ll_n1)) 1573 while (ll_li != NULL && (lp->ll_empty2 || lp->ll_n2 >= ll_n1))
1574 { 1574 {
1575 li = ll_li->li_next; 1575 li = ll_li->li_next;
1576 if (var_check_lock(ll_li->li_tv.v_lock, lp->ll_name, FALSE)) 1576 if (value_check_lock(ll_li->li_tv.v_lock, lp->ll_name, FALSE))
1577 return FAIL; 1577 return FAIL;
1578 ll_li = li; 1578 ll_li = li;
1579 ++ll_n1; 1579 ++ll_n1;
1580 } 1580 }
1581 1581
1644 if (hi != NULL && !HASHITEM_EMPTY(hi)) 1644 if (hi != NULL && !HASHITEM_EMPTY(hi))
1645 { 1645 {
1646 di = HI2DI(hi); 1646 di = HI2DI(hi);
1647 if (var_check_fixed(di->di_flags, name, FALSE) 1647 if (var_check_fixed(di->di_flags, name, FALSE)
1648 || var_check_ro(di->di_flags, name, FALSE) 1648 || var_check_ro(di->di_flags, name, FALSE)
1649 || var_check_lock(d->dv_lock, name, FALSE)) 1649 || value_check_lock(d->dv_lock, name, FALSE))
1650 return FAIL; 1650 return FAIL;
1651 1651
1652 delete_var(ht, hi); 1652 delete_var(ht, hi);
1653 return OK; 1653 return OK;
1654 } 1654 }
1675 int lock = eap->cmdidx == CMD_lockvar; 1675 int lock = eap->cmdidx == CMD_lockvar;
1676 int ret = OK; 1676 int ret = OK;
1677 int cc; 1677 int cc;
1678 dictitem_T *di; 1678 dictitem_T *di;
1679 1679
1680 if (deep == 0) // nothing to do
1681 return OK;
1682
1683 if (lp->ll_tv == NULL) 1680 if (lp->ll_tv == NULL)
1684 { 1681 {
1685 cc = *name_end; 1682 cc = *name_end;
1686 *name_end = NUL; 1683 *name_end = NUL;
1687 if (*lp->ll_name == '$') 1684 if (*lp->ll_name == '$')
1708 { 1705 {
1709 if (lock) 1706 if (lock)
1710 di->di_flags |= DI_FLAGS_LOCK; 1707 di->di_flags |= DI_FLAGS_LOCK;
1711 else 1708 else
1712 di->di_flags &= ~DI_FLAGS_LOCK; 1709 di->di_flags &= ~DI_FLAGS_LOCK;
1713 item_lock(&di->di_tv, deep, lock, FALSE); 1710 if (deep != 0)
1711 item_lock(&di->di_tv, deep, lock, FALSE);
1714 } 1712 }
1715 } 1713 }
1716 *name_end = cc; 1714 *name_end = cc;
1715 }
1716 else if (deep == 0)
1717 {
1718 // nothing to do
1717 } 1719 }
1718 else if (lp->ll_range) 1720 else if (lp->ll_range)
1719 { 1721 {
1720 listitem_T *li = lp->ll_li; 1722 listitem_T *li = lp->ll_li;
1721 1723
3005 // check the type and adjust to bool if needed 3007 // check the type and adjust to bool if needed
3006 if (check_script_var_type(&di->di_tv, tv, name) == FAIL) 3008 if (check_script_var_type(&di->di_tv, tv, name) == FAIL)
3007 goto failed; 3009 goto failed;
3008 } 3010 }
3009 3011
3012 // Check in this order for backwards compatibility:
3013 // - Whether the variable is read-only
3014 // - Whether the variable value is locked
3015 // - Whether the variable is locked
3010 if (var_check_ro(di->di_flags, name, FALSE) 3016 if (var_check_ro(di->di_flags, name, FALSE)
3011 || var_check_lock(di->di_tv.v_lock, name, FALSE)) 3017 || value_check_lock(di->di_tv.v_lock, name, FALSE)
3018 || var_check_lock(di->di_flags, name, FALSE))
3012 goto failed; 3019 goto failed;
3013 } 3020 }
3014 else 3021 else
3015 // can only redefine once 3022 // can only redefine once
3016 di->di_flags &= ~DI_FLAGS_RELOAD; 3023 di->di_flags &= ~DI_FLAGS_RELOAD;
3156 } 3163 }
3157 return FALSE; 3164 return FALSE;
3158 } 3165 }
3159 3166
3160 /* 3167 /*
3168 * Return TRUE if di_flags "flags" indicates variable "name" is locked.
3169 * Also give an error message.
3170 */
3171 int
3172 var_check_lock(int flags, char_u *name, int use_gettext)
3173 {
3174 if (flags & DI_FLAGS_LOCK)
3175 {
3176 semsg(_(e_variable_is_locked_str),
3177 use_gettext ? (char_u *)_(name) : name);
3178 return TRUE;
3179 }
3180 return FALSE;
3181 }
3182
3183 /*
3161 * Return TRUE if di_flags "flags" indicates variable "name" is fixed. 3184 * Return TRUE if di_flags "flags" indicates variable "name" is fixed.
3162 * Also give an error message. 3185 * Also give an error message.
3163 */ 3186 */
3164 int 3187 int
3165 var_check_fixed(int flags, char_u *name, int use_gettext) 3188 var_check_fixed(int flags, char_u *name, int use_gettext)
3202 } 3225 }
3203 return FALSE; 3226 return FALSE;
3204 } 3227 }
3205 3228
3206 /* 3229 /*
3207 * Return TRUE if "flags" indicates variable "name" is locked (immutable). 3230 * Return TRUE if "flags" indicates variable "name" has a locked (immutable)
3208 * Also give an error message, using "name" or _("name") when use_gettext is 3231 * value. Also give an error message, using "name" or _("name") when
3209 * TRUE. 3232 * "use_gettext" is TRUE.
3210 */ 3233 */
3211 int 3234 int
3212 var_check_lock(int lock, char_u *name, int use_gettext) 3235 value_check_lock(int lock, char_u *name, int use_gettext)
3213 { 3236 {
3214 if (lock & VAR_LOCKED) 3237 if (lock & VAR_LOCKED)
3215 { 3238 {
3216 semsg(_("E741: Value is locked: %s"), 3239 semsg(_("E741: Value is locked: %s"),
3217 name == NULL ? (char_u *)_("Unknown") 3240 name == NULL ? (char_u *)_("Unknown")