]> granicus.if.org Git - vim/commitdiff
patch 8.0.1377: cannot call a dict function in autoloaded dict v8.0.1377
authorBram Moolenaar <Bram@vim.org>
Thu, 7 Dec 2017 21:11:27 +0000 (22:11 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 7 Dec 2017 21:11:27 +0000 (22:11 +0100)
Problem:    Cannot call a dict function in autoloaded dict.
Solution:   Call get_lval() passing the read-only flag.

src/Makefile
src/eval.c
src/testdir/Make_all.mak
src/testdir/sautest/autoload/foo.vim [new file with mode: 0644]
src/testdir/sautest/autoload/globone.vim [new file with mode: 0644]
src/testdir/sautest/autoload/globtwo.vim [new file with mode: 0644]
src/testdir/test_autoload.vim [new file with mode: 0644]
src/testdir/test_escaped_glob.vim
src/userfunc.c
src/version.c

index 7ccd766999c56702df13727dc62272d0794eae56..2a66a02de4232a2621f9b9fc70fef08c6552383b 100644 (file)
@@ -2120,6 +2120,7 @@ test_arglist \
        test_assign \
        test_autochdir \
        test_autocmd \
+       test_autoload \
        test_backspace_opt \
        test_breakindent \
        test_bufline \
index b3e2be5d0e396cd3123467dc2709fac6803f02da..1cced57ec0196c1eb1c60a4ddf16d44d747c275f 100644 (file)
@@ -1956,7 +1956,10 @@ get_lval(
 
     cc = *p;
     *p = NUL;
-    v = find_var(lp->ll_name, &ht, flags & GLV_NO_AUTOLOAD);
+    /* Only pass &ht when we would write to the variable, it prevents autoload
+     * as well. */
+    v = find_var(lp->ll_name, (flags & GLV_READ_ONLY) ? NULL : &ht,
+                                                     flags & GLV_NO_AUTOLOAD);
     if (v == NULL && !quiet)
        EMSG2(_(e_undefvar), lp->ll_name);
     *p = cc;
@@ -6610,6 +6613,8 @@ get_vim_var_nr(int idx)
 
 /*
  * Get string v: variable value.  Uses a static buffer, can only be used once.
+ * If the String variable has never been set, return an empty string.
+ * Never returns NULL;
  */
     char_u *
 get_vim_var_str(int idx)
index df79e9ab9ab58d29d75d1e5b849a3e6689c1d24f..5d5fccf10978914e9be1bc96270e399e2f806e3d 100644 (file)
@@ -73,6 +73,7 @@ NEW_TESTS = test_arabic.res \
            test_assert.res \
            test_autochdir.res \
            test_autocmd.res \
+           test_autoload.res \
            test_backspace_opt.res \
            test_breakindent.res \
            test_bufwintabinfo.res \
diff --git a/src/testdir/sautest/autoload/foo.vim b/src/testdir/sautest/autoload/foo.vim
new file mode 100644 (file)
index 0000000..d7dcd5c
--- /dev/null
@@ -0,0 +1,7 @@
+let g:loaded_foo_vim += 1
+
+let foo#bar = {}
+
+func foo#bar.echo()
+  let g:called_foo_bar_echo += 1
+endfunc
diff --git a/src/testdir/sautest/autoload/globone.vim b/src/testdir/sautest/autoload/globone.vim
new file mode 100644 (file)
index 0000000..98c9a10
--- /dev/null
@@ -0,0 +1 @@
+" used by Test_globpath()
diff --git a/src/testdir/sautest/autoload/globtwo.vim b/src/testdir/sautest/autoload/globtwo.vim
new file mode 100644 (file)
index 0000000..98c9a10
--- /dev/null
@@ -0,0 +1 @@
+" used by Test_globpath()
diff --git a/src/testdir/test_autoload.vim b/src/testdir/test_autoload.vim
new file mode 100644 (file)
index 0000000..a92851f
--- /dev/null
@@ -0,0 +1,11 @@
+" Tests for autoload
+
+set runtimepath=./sautest
+
+func! Test_autoload_dict_func()
+  let g:loaded_foo_vim = 0
+  let g:called_foo_bar_echo = 0
+  call g:foo#bar.echo()
+  call assert_equal(1, g:loaded_foo_vim)
+  call assert_equal(1, g:called_foo_bar_echo)
+endfunc
index b91c6e742493f9227294b57bb709d8f5bd3b713b..e0723da6f00f916d08c366817f7f9dcfda4b8805 100644 (file)
@@ -25,8 +25,8 @@ function Test_glob()
 endfunction
 
 function Test_globpath()
-  call assert_equal("sautest/autoload/Test104.vim\nsautest/autoload/footest.vim",
-        \ globpath('sautest/autoload', '*.vim'))
-  call assert_equal(['sautest/autoload/Test104.vim', 'sautest/autoload/footest.vim'],
-        \ globpath('sautest/autoload', '*.vim', 0, 1))
+  call assert_equal("sautest/autoload/globone.vim\nsautest/autoload/globtwo.vim",
+        \ globpath('sautest/autoload', 'glob*.vim'))
+  call assert_equal(['sautest/autoload/globone.vim', 'sautest/autoload/globtwo.vim'],
+        \ globpath('sautest/autoload', 'glob*.vim', 0, 1))
 endfunction
index e187684551787a986990f8287da1b6ddba79c139..9b605544062c32399691e153bd952b02baef8bb0 100644 (file)
@@ -1594,7 +1594,7 @@ trans_function_name(
        start += lead;
 
     /* Note that TFN_ flags use the same values as GLV_ flags. */
-    end = get_lval(start, NULL, &lv, FALSE, skip, flags,
+    end = get_lval(start, NULL, &lv, FALSE, skip, flags | GLV_READ_ONLY,
                                              lead > 2 ? 0 : FNE_CHECK_START);
     if (end == start)
     {
index 4361c384f90acfa142049325ca8e49ebd99125a0..7fe7e8f2c5878cb54d3f6cb2ca8b267cf90cb7d5 100644 (file)
@@ -771,6 +771,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1377,
 /**/
     1376,
 /**/