eval: Forbid (un)locking b:changedtick

Port of vim-patch:8.0.0343
This commit is contained in:
ZyX
2017-02-23 00:59:11 +03:00
parent 9668d26a43
commit d8a7e5fdbb
3 changed files with 18 additions and 7 deletions

View File

@@ -8606,9 +8606,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
will 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

@@ -3091,6 +3091,12 @@ static int do_lock_var(lval_T *lp, char_u *name_end, int deep, int lock)
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 historical reasons this error is not given for Lists and
// Dictionaries. E.g. b: dictionary may be locked/unlocked.
emsgf(_("E940: Cannot lock or unlock variable %s"), lp->ll_name);
} else {
if ((di->di_flags & (DI_FLAGS_LOCK|DI_FLAGS_FIX))
== (DI_FLAGS_LOCK|DI_FLAGS_FIX)) {

View File

@@ -101,19 +101,21 @@ describe('b:changedtick', function()
redir_exec(':let b:'))
end)
it('fails to unlock b:changedtick', function()
-- Note:
-- - unlocking VAR_FIXED variables is not an error.
-- - neither VAR_FIXED variables are reported as locked by islocked().
-- So test mostly checks that b:changedtick status does not change.
eq(0, exc_exec('let d = b:'))
eq(0, funcs.islocked('b:changedtick'))
eq(0, funcs.islocked('d.changedtick'))
eq('',
eq('\nE940: Cannot lock or unlock variable b:changedtick',
redir_exec('unlockvar b:changedtick'))
eq('\nE46: Cannot change read-only variable "d.changedtick"',
redir_exec('unlockvar d.changedtick'))
eq(0, funcs.islocked('b:changedtick'))
eq(0, funcs.islocked('d.changedtick'))
eq('\nE940: Cannot lock or unlock variable b:changedtick',
redir_exec('lockvar b:changedtick'))
eq('\nE46: Cannot change read-only variable "d.changedtick"',
redir_exec('lockvar d.changedtick'))
eq(0, funcs.islocked('b:changedtick'))
eq(0, funcs.islocked('d.changedtick'))
end)
it('is being completed', function()
feed(':echo b:<Tab><Home>let cmdline="<End>"<CR>')