Mercurial > vim
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") |