From: Bram Moolenaar Date: Tue, 21 Feb 2017 19:47:13 +0000 (+0100) Subject: patch 8.0.0345: islocked('d.changedtick') does not work X-Git-Tag: v8.0.0345 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3a257737726ba42980bf38ec9a0c80944756af24;p=vim 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 index 328c2b37c..b394d8e6c 100644 --- 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 index b835af8e3..c4154d01d 100644 --- 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 index 55900bd9a..1307d1203 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -6561,7 +6561,7 @@ f_islocked(typval_T *argvars, typval_T *rettv) 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 index 9aaba2770..3a91bb54a 100644 --- 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 index 721485434..2b08df52e 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 345, /**/ 344, /**/ diff --git a/src/vim.h b/src/vim.h index f3e87fef5..8636c56d0 100644 --- 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. */