0
0
mirror of https://github.com/vim/vim.git synced 2025-07-04 23:07:33 -04:00

patch 8.0.0343: b:changedtick can be unlocked

Problem:    b:changedtick can be unlocked, even though it has no effect.
            (Nikolai Pavlov)
Solution:   Add a check and error E940. (closes #1496)
This commit is contained in:
Bram Moolenaar 2017-02-20 22:35:33 +01:00
parent 673911457d
commit e7877fe0de
4 changed files with 24 additions and 7 deletions

View File

@ -9082,9 +9082,12 @@ This does NOT work: >
:lockvar v
:let v = 'asdf' " fails!
:unlet v
< *E741*
< *E741* *E940*
If you try to change a locked variable you get an
error message: "E741: Value is locked: {name}"
error message: "E741: Value is locked: {name}".
If you try to lock or unlock a built-in variable you
get an error message: "E940: Cannot lock or unlock
variable {name}".
[depth] is relevant when locking a |List| or
|Dictionary|. It specifies how deep the locking goes:

View File

@ -2882,6 +2882,12 @@ do_lock_var(
di = find_var(lp->ll_name, NULL, TRUE);
if (di == NULL)
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. */
EMSG2(_("E940: Cannot lock or unlock variable %s"), lp->ll_name);
else
{
if (lock)

View File

@ -33,13 +33,19 @@ func Test_changedtick_bdel()
endfunc
func Test_changedtick_fixed()
call assert_fails('let b:changedtick = 4', 'E46')
call assert_fails('let b:["changedtick"] = 4', 'E46')
call assert_fails('let b:changedtick = 4', 'E46:')
call assert_fails('let b:["changedtick"] = 4', 'E46:')
call assert_fails('unlet b:changedtick', 'E795')
call assert_fails('unlet b:["changedtick"]', 'E46')
call assert_fails('lockvar b:changedtick', 'E940:')
call assert_fails('lockvar b:["changedtick"]', 'E46:')
call assert_fails('unlockvar b:changedtick', 'E940:')
call assert_fails('unlockvar b:["changedtick"]', 'E46:')
call assert_fails('unlet b:changedtick', 'E795:')
call assert_fails('unlet b:["changedtick"]', 'E46:')
let d = b:
call assert_fails('unlet d["changedtick"]', 'E46')
call assert_fails('lockvar d["changedtick"]', 'E46:')
call assert_fails('unlockvar d["changedtick"]', 'E46:')
call assert_fails('unlet d["changedtick"]', 'E46:')
endfunc

View File

@ -764,6 +764,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
343,
/**/
342,
/**/