To: vim_dev@googlegroups.com Subject: Patch 8.0.0343 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0343 Problem: b:changedtick can be unlocked, even though it has no effect. (Nikolai Pavlov) Solution: Add a check and error E940. (closes #1496) Files: src/eval.c, src/testdir/test_changedtick.vim, runtime/doc/eval.txt *** ../vim-8.0.0342/src/eval.c 2017-02-17 16:31:16.917294167 +0100 --- src/eval.c 2017-02-20 22:31:32.023285476 +0100 *************** *** 2882,2887 **** --- 2882,2893 ---- 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) *** ../vim-8.0.0342/src/testdir/test_changedtick.vim 2017-02-17 16:31:16.929294079 +0100 --- src/testdir/test_changedtick.vim 2017-02-20 22:20:30.172487079 +0100 *************** *** 33,45 **** endfunc func Test_changedtick_fixed() ! 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') let d = b: ! call assert_fails('unlet d["changedtick"]', 'E46') endfunc --- 33,51 ---- endfunc func Test_changedtick_fixed() ! call assert_fails('let b:changedtick = 4', 'E46:') ! call assert_fails('let b:["changedtick"] = 4', '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('lockvar d["changedtick"]', 'E46:') ! call assert_fails('unlockvar d["changedtick"]', 'E46:') ! call assert_fails('unlet d["changedtick"]', 'E46:') endfunc *** ../vim-8.0.0342/runtime/doc/eval.txt 2017-02-01 17:24:29.677328148 +0100 --- runtime/doc/eval.txt 2017-02-20 22:15:56.938641719 +0100 *************** *** 9063,9071 **** :lockvar v :let v = 'asdf' " fails! :unlet v ! < *E741* If you try to change a locked variable you get an ! error message: "E741: Value is locked: {name}" [depth] is relevant when locking a |List| or |Dictionary|. It specifies how deep the locking goes: --- 9082,9093 ---- :lockvar v :let v = 'asdf' " fails! :unlet v ! < *E741* *E940* If you try to change a locked variable you get an ! 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: *** ../vim-8.0.0342/src/version.c 2017-02-19 21:07:01.006386644 +0100 --- src/version.c 2017-02-20 22:22:02.543759670 +0100 *************** *** 766,767 **** --- 766,769 ---- { /* Add new patch number below this line */ + /**/ + 343, /**/ -- For society, it's probably a good thing that engineers value function over appearance. For example, you wouldn't want engineers to build nuclear power plants that only _look_ like they would keep all the radiation inside. (Scott Adams - The Dilbert principle) /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///