]> granicus.if.org Git - vim/commitdiff
patch 8.0.0345: islocked('d.changedtick') does not work v8.0.0345
authorBram Moolenaar <Bram@vim.org>
Tue, 21 Feb 2017 19:47:13 +0000 (20:47 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 21 Feb 2017 19:47:13 +0000 (20:47 +0100)
Problem:    islocked('d.changedtick') does not work.
Solution:   Make it work.

src/buffer.c
src/eval.c
src/evalfunc.c
src/testdir/test_changedtick.vim
src/version.c
src/vim.h

index 328c2b37c290d117fe8079588475889a6c767cf6..b394d8e6c231d00ce3fb03fb93285012eb234293 100644 (file)
@@ -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;
index b835af8e394664e26fd6520869867ad7773a4751..c4154d01d4f4fe8f74fdbc3b5aba666b4678d316 100644 (file)
@@ -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;
index 55900bd9a4f0ec493c1c59c56b6bced3686885c5..1307d1203f8bbdb1d2c494cdd88e62f1a97097fd 100644 (file)
@@ -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)
index 9aaba2770be2b2624036f9d8e89e171406972903..3a91bb54aa20363c6187e503c40c62dd6c63ee2d 100644 (file)
@@ -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:')
index 7214854343cbac94b26349923b2bf534002e8e8b..2b08df52e15ca5cedf0bdc20c0eaa094cc3b320c 100644 (file)
@@ -764,6 +764,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    345,
 /**/
     344,
 /**/
index f3e87fef5cbcbe1cfb5b0dc7283818293448ec77..8636c56d055218535d224853fb42fc7f1c9ec229 100644 (file)
--- 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. */