]> granicus.if.org Git - vim/commitdiff
patch 8.2.1541: Vim9: cannot find function reference for s:Func v8.2.1541
authorBram Moolenaar <Bram@vim.org>
Sat, 29 Aug 2020 15:47:08 +0000 (17:47 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 29 Aug 2020 15:47:08 +0000 (17:47 +0200)
Problem:    Vim9: cannot find function reference for s:Func.
Solution:   Recognize <SNR> prefix. (closes #6805)

src/testdir/test_vim9_script.vim
src/userfunc.c
src/version.c
src/vim9execute.c

index 49aacb0fab1d942c6b7905dda60daa67ec1787de..662024cbd6a0cfc7aab87f42b8ce0c1a4927dffd 100644 (file)
@@ -1652,6 +1652,10 @@ def Test_vim9script_reload_import()
   delete('Ximport.vim')
 enddef
 
+def s:RetSome(): string
+  return 'some'
+enddef
+
 " Not exported function that is referenced needs to be accessed by the
 " script-local name.
 def Test_vim9script_funcref()
@@ -1683,6 +1687,9 @@ def Test_vim9script_funcref()
   unlet g:result
   delete('Xsort.vim')
   delete('Xscript.vim')
+
+  let Funcref = function('s:RetSome')
+  assert_equal('some', Funcref())
 enddef
 
 " Check that when searching for "FilterFunc" it finds the import in the
index be706bdbbde1d2b522ea712d765ce9d0f02b977e..d91890373adfa8c961c34c6bde4b2d104cc429bf 100644 (file)
@@ -808,11 +808,12 @@ find_func_even_dead(char_u *name, int is_global, cctx_T *cctx)
 
     if (!is_global)
     {
-       int     vim9script = in_vim9script();
        char_u  *after_script = NULL;
        long    sid = 0;
+       int     find_script_local = in_vim9script()
+                                    && eval_isnamec1(*name) && name[1] != ':';
 
-       if (vim9script)
+       if (find_script_local)
        {
            // Find script-local function before global one.
            func = find_func_with_sid(name, current_sctx.sc_sid);
@@ -833,7 +834,7 @@ find_func_even_dead(char_u *name, int is_global, cctx_T *cctx)
            else
                after_script = NULL;
        }
-       if (vim9script || after_script != NULL)
+       if (find_script_local || after_script != NULL)
        {
            // Find imported function before global one.
            if (after_script != NULL && sid != current_sctx.sc_sid)
index cd341e2d85153033f2b78f120d68ae85b4b3ef31..a76e129a56e83e476f8124c1ec71aec5ed6e251f 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1541,
 /**/
     1540,
 /**/
index 05cf5da6fbda82ddfed43dbf8048fda2e813bc4f..9bc0d45d34400d3a33682cfb94ba5daab2e060ea 100644 (file)
@@ -614,6 +614,7 @@ call_partial(typval_T *tv, int argcount_arg, ectx_T *ectx)
     int                argcount = argcount_arg;
     char_u     *name = NULL;
     int                called_emsg_before = called_emsg;
+    int                res;
 
     if (tv->v_type == VAR_PARTIAL)
     {
@@ -650,7 +651,23 @@ call_partial(typval_T *tv, int argcount_arg, ectx_T *ectx)
     }
     else if (tv->v_type == VAR_FUNC)
        name = tv->vval.v_string;
-    if (name == NULL || call_by_name(name, argcount, ectx, NULL) == FAIL)
+    if (name != NULL)
+    {
+       char_u  fname_buf[FLEN_FIXED + 1];
+       char_u  *tofree = NULL;
+       int     error = FCERR_NONE;
+       char_u  *fname;
+
+       // May need to translate <SNR>123_ to K_SNR.
+       fname = fname_trans_sid(name, fname_buf, &tofree, &error);
+       if (error != FCERR_NONE)
+           res = FAIL;
+       else
+           res = call_by_name(fname, argcount, ectx, NULL);
+       vim_free(tofree);
+    }
+
+    if (name == NULL || res == FAIL)
     {
        if (called_emsg == called_emsg_before)
            semsg(_(e_unknownfunc),