To: vim_dev@googlegroups.com Subject: Patch 8.2.4030 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4030 Problem: A script local funcref is not found from a mapping. Solution: When looking for a function, also find a script-local funcref. (closes #9485) Files: src/evalvars.c, src/proto/evalvars.pro, src/userfunc.c, src/testdir/test_vim9_script.vim *** ../vim-8.2.4029/src/evalvars.c 2022-01-07 12:45:24.115723150 +0000 --- src/evalvars.c 2022-01-07 18:18:45.298873653 +0000 *************** *** 2690,2696 **** { if ((flags & EVAL_VAR_IMPORT) == 0) { ! if (sid != 0 && SCRIPT_ID_VALID(sid)) { ht = &SCRIPT_VARS(sid); if (ht != NULL) --- 2690,2696 ---- { if ((flags & EVAL_VAR_IMPORT) == 0) { ! if (SCRIPT_ID_VALID(sid)) { ht = &SCRIPT_VARS(sid); if (ht != NULL) *************** *** 2878,2883 **** --- 2878,2912 ---- } /* + * Like find_var() but if the name starts with 99_ then look in the + * referenced script (used for a funcref). + */ + dictitem_T * + find_var_also_in_script(char_u *name, hashtab_T **htp, int no_autoload) + { + if (STRNCMP(name, "", 5) == 0 && isdigit(name[5])) + { + char_u *p = name + 5; + int sid = getdigits(&p); + + if (SCRIPT_ID_VALID(sid) && *p == '_') + { + hashtab_T *ht = &SCRIPT_VARS(sid); + + if (ht != NULL) + { + dictitem_T *di = find_var_in_ht(ht, 0, p + 1, no_autoload); + + if (di != NULL) + return di; + } + } + } + + return find_var(name, htp, no_autoload); + } + + /* * Find variable "varname" in hashtab "ht" with name "htname". * When "varname" is empty returns curwin/curtab/etc vars dictionary. * Returns NULL if not found. *** ../vim-8.2.4029/src/proto/evalvars.pro 2022-01-06 21:10:24.469027861 +0000 --- src/proto/evalvars.pro 2022-01-07 18:07:59.611351152 +0000 *************** *** 60,65 **** --- 60,66 ---- int eval_variable(char_u *name, int len, scid_T sid, typval_T *rettv, dictitem_T **dip, int flags); void check_vars(char_u *name, int len); dictitem_T *find_var(char_u *name, hashtab_T **htp, int no_autoload); + dictitem_T *find_var_also_in_script(char_u *name, hashtab_T **htp, int no_autoload); dictitem_T *find_var_in_ht(hashtab_T *ht, int htname, char_u *varname, int no_autoload); hashtab_T *get_script_local_ht(void); int lookup_scriptitem(char_u *name, size_t len, int cmd, cctx_T *dummy); *** ../vim-8.2.4029/src/userfunc.c 2022-01-07 12:45:24.115723150 +0000 --- src/userfunc.c 2022-01-07 18:07:54.683363169 +0000 *************** *** 1589,1595 **** cc = name[*lenp]; name[*lenp] = NUL; ! v = find_var(name, &ht, no_autoload); name[*lenp] = cc; if (v != NULL) { --- 1589,1595 ---- cc = name[*lenp]; name[*lenp] = NUL; ! v = find_var_also_in_script(name, &ht, no_autoload); name[*lenp] = cc; if (v != NULL) { *** ../vim-8.2.4029/src/testdir/test_vim9_script.vim 2022-01-07 14:39:52.233887862 +0000 --- src/testdir/test_vim9_script.vim 2022-01-07 18:19:44.230927729 +0000 *************** *** 1662,1693 **** &rtp = save_rtp enddef ! " FIXME ! "def Test_use_import_in_mapping() ! " var lines =<< trim END ! " vim9script ! " export def Funcx() ! " g:result = 42 ! " enddef ! " END ! " writefile(lines, 'XsomeExport.vim') ! " lines =<< trim END ! " vim9script ! " import './XsomeExport.vim' as some ! " var Funcy = some.Funcx ! " nnoremap :call Funcy() ! " END ! " writefile(lines, 'Xmapscript.vim') ! " ! " source Xmapscript.vim ! " feedkeys("\", "xt") ! " assert_equal(42, g:result) ! " ! " unlet g:result ! " delete('XsomeExport.vim') ! " delete('Xmapscript.vim') ! " nunmap ! "enddef def Test_vim9script_mix() var lines =<< trim END --- 1662,1692 ---- &rtp = save_rtp enddef ! def Test_use_import_in_mapping() ! var lines =<< trim END ! vim9script ! export def Funcx() ! g:result = 42 ! enddef ! END ! writefile(lines, 'XsomeExport.vim') ! lines =<< trim END ! vim9script ! import './XsomeExport.vim' as some ! var Funcy = some.Funcx ! nnoremap :call Funcy() ! END ! writefile(lines, 'Xmapscript.vim') ! ! source Xmapscript.vim ! feedkeys("\", "xt") ! assert_equal(42, g:result) ! ! unlet g:result ! delete('XsomeExport.vim') ! delete('Xmapscript.vim') ! nunmap ! enddef def Test_vim9script_mix() var lines =<< trim END *** ../vim-8.2.4029/src/version.c 2022-01-07 16:55:27.116417587 +0000 --- src/version.c 2022-01-07 18:08:58.011209101 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4030, /**/ -- hundred-and-one symptoms of being an internet addict: 247. You use www.switchboard.com instead of dialing 411 and 555-12-12 for directory assistance. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///