# HG changeset patch # User Christian Brabandt # Date 1487707204 -3600 # Node ID fd1760f8c215256d5820cac4a0a35e0b65c1914d # Parent 09f200404633ae9a993f73c95cfa62fd6b762df9 patch 8.0.0345: islocked('d.changedtick') does not work commit https://github.com/vim/vim/commit/3a257737726ba42980bf38ec9a0c80944756af24 Author: Bram Moolenaar Date: Tue Feb 21 20:47:13 2017 +0100 patch 8.0.0345: islocked('d.changedtick') does not work Problem: islocked('d.changedtick') does not work. Solution: Make it work. diff --git a/src/buffer.c b/src/buffer.c --- a/src/buffer.c +++ b/src/buffer.c @@ -884,7 +884,7 @@ init_changedtick(buf_T *buf) if (di != NULL) { - di->di_flags |= DI_FLAGS_LOCK | DI_FLAGS_FIX | DI_FLAGS_RO; + di->di_flags |= DI_FLAGS_FIX | DI_FLAGS_RO; di->di_tv.v_type = VAR_NUMBER; di->di_tv.v_lock = VAR_FIXED; di->di_tv.vval.v_number = 0; diff --git a/src/eval.c b/src/eval.c --- a/src/eval.c +++ b/src/eval.c @@ -1811,6 +1811,7 @@ ex_let_one( * * flags: * GLV_QUIET: do not give error messages + * GLV_READ_ONLY: will not change the variable * GLV_NO_AUTOLOAD: do not use script autoloading * * Returns a pointer to just after the name, including indexes. @@ -2078,7 +2079,8 @@ get_lval( break; } /* existing variable, need to check if it can be changed */ - else if (var_check_ro(lp->ll_di->di_flags, name, FALSE)) + else if ((flags & GLV_READ_ONLY) == 0 + && var_check_ro(lp->ll_di->di_flags, name, FALSE)) { clear_tv(&var1); return NULL; diff --git a/src/evalfunc.c b/src/evalfunc.c --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -6561,7 +6561,7 @@ f_islocked(typval_T *argvars, typval_T * rettv->vval.v_number = -1; end = get_lval(get_tv_string(&argvars[0]), NULL, &lv, FALSE, FALSE, - GLV_NO_AUTOLOAD, FNE_CHECK_START); + GLV_NO_AUTOLOAD | GLV_READ_ONLY, FNE_CHECK_START); if (end != NULL && lv.ll_name != NULL) { if (*end != NUL) diff --git a/src/testdir/test_changedtick.vim b/src/testdir/test_changedtick.vim --- a/src/testdir/test_changedtick.vim +++ b/src/testdir/test_changedtick.vim @@ -32,6 +32,12 @@ func Test_changedtick_bdel() call assert_equal(v + 1, getbufvar(bnr, 'changedtick')) endfunc +func Test_changedtick_islocked() + call assert_equal(0, islocked('b:changedtick')) + let d = b: + call assert_equal(0, islocked('d.changedtick')) +endfunc + func Test_changedtick_fixed() call assert_fails('let b:changedtick = 4', 'E46:') call assert_fails('let b:["changedtick"] = 4', 'E46:') diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 345, +/**/ 344, /**/ 343, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -2474,10 +2474,12 @@ typedef enum { #define TFN_QUIET 2 /* no error messages */ #define TFN_NO_AUTOLOAD 4 /* do not use script autoloading */ #define TFN_NO_DEREF 8 /* do not dereference a Funcref */ +#define TFN_READ_ONLY 16 /* will not change the var */ /* Values for get_lval() flags argument: */ #define GLV_QUIET TFN_QUIET /* no error messages */ #define GLV_NO_AUTOLOAD TFN_NO_AUTOLOAD /* do not use script autoloading */ +#define GLV_READ_ONLY TFN_READ_ONLY /* will not change the var */ #define DO_NOT_FREE_CNT 99999 /* refcount for dict or list that should not be freed. */