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:
parent
673911457d
commit
e7877fe0de
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -764,6 +764,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
343,
|
||||
/**/
|
||||
342,
|
||||
/**/
|
||||
|
Loading…
x
Reference in New Issue
Block a user