To: vim_dev@googlegroups.com Subject: Patch 8.2.1426 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.1426 Problem: Vim9: cannot call autoload function in :def function. Solution: Load the autoload script. (closes #6690) Files: src/vim9execute.c, src/vim9compile.c, src/scriptfile.c, src/testdir/test_vim9_expr.vim *** ../vim-8.2.1425/src/vim9execute.c 2020-08-01 15:38:33.941599081 +0200 --- src/vim9execute.c 2020-08-12 15:20:52.722743636 +0200 *************** *** 546,551 **** --- 546,560 ---- } /* + * Return TRUE if an error was given or CTRL-C was pressed. + */ + static int + vim9_aborting(int prev_called_emsg) + { + return called_emsg > prev_called_emsg || got_int || did_throw; + } + + /* * Execute a function by "name". * This can be a builtin function or a user function. * "iptr" can be used to replace the instruction with a more efficient one. *************** *** 568,573 **** --- 577,594 ---- } ufunc = find_func(name, FALSE, NULL); + + if (ufunc == NULL) + { + int called_emsg_before = called_emsg; + + if (script_autoload(name, TRUE)) + // loaded a package, search for the function again + ufunc = find_func(name, FALSE, NULL); + if (vim9_aborting(called_emsg_before)) + return FAIL; // bail out if loading the script caused an error + } + if (ufunc != NULL) return call_ufunc(ufunc, argcount, ectx, iptr); *** ../vim-8.2.1425/src/vim9compile.c 2020-08-12 14:21:06.263590410 +0200 --- src/vim9compile.c 2020-08-12 15:03:26.894566551 +0200 *************** *** 2214,2219 **** --- 2214,2220 ---- int error = FCERR_NONE; ufunc_T *ufunc; int res = FAIL; + int is_autoload; // we can evaluate "has('name')" at compile time if (varlen == 3 && STRNCMP(*arg, "has", 3) == 0) *************** *** 2258,2264 **** if (compile_arguments(arg, cctx, &argcount) == FAIL) goto theend; ! if (ASCII_ISLOWER(*name) && name[1] != ':') { int idx; --- 2259,2266 ---- if (compile_arguments(arg, cctx, &argcount) == FAIL) goto theend; ! is_autoload = vim_strchr(name, '#') != NULL; ! if (ASCII_ISLOWER(*name) && name[1] != ':' && !is_autoload) { int idx; *************** *** 2281,2288 **** // If the name is a variable, load it and use PCALL. // Not for g:Func(), we don't know if it is a variable or not. p = namebuf; ! if (STRNCMP(namebuf, "g:", 2) != 0 && compile_load(&p, namebuf + varlen, cctx, FALSE) == OK) { garray_T *stack = &cctx->ctx_type_stack; --- 2283,2291 ---- // If the name is a variable, load it and use PCALL. // Not for g:Func(), we don't know if it is a variable or not. + // Not for eome#Func(), it will be loaded later. p = namebuf; ! if (STRNCMP(namebuf, "g:", 2) != 0 && !is_autoload && compile_load(&p, namebuf + varlen, cctx, FALSE) == OK) { garray_T *stack = &cctx->ctx_type_stack; *************** *** 2295,2301 **** // A global function may be defined only later. Need to figure out at // runtime. Also handles a FuncRef at runtime. ! if (STRNCMP(namebuf, "g:", 2) == 0) res = generate_UCALL(cctx, name, argcount); else semsg(_(e_unknownfunc), namebuf); --- 2298,2304 ---- // A global function may be defined only later. Need to figure out at // runtime. Also handles a FuncRef at runtime. ! if (STRNCMP(namebuf, "g:", 2) == 0 || is_autoload) res = generate_UCALL(cctx, name, argcount); else semsg(_(e_unknownfunc), namebuf); *** ../vim-8.2.1425/src/scriptfile.c 2020-08-08 21:33:17.788742735 +0200 --- src/scriptfile.c 2020-08-12 14:49:43.297328664 +0200 *************** *** 1991,1997 **** if (scriptname == NULL) return NULL; STRCPY(scriptname, "autoload/"); ! STRCAT(scriptname, name); for (p = scriptname + 9; (p = vim_strchr(p, AUTOLOAD_CHAR)) != NULL; q = p, ++p) *p = '/'; --- 1991,1997 ---- if (scriptname == NULL) return NULL; STRCPY(scriptname, "autoload/"); ! STRCAT(scriptname, name[0] == 'g' && name[1] == ':' ? name + 2: name); for (p = scriptname + 9; (p = vim_strchr(p, AUTOLOAD_CHAR)) != NULL; q = p, ++p) *p = '/'; *** ../vim-8.2.1425/src/testdir/test_vim9_expr.vim 2020-08-10 23:09:33.761270906 +0200 --- src/testdir/test_vim9_expr.vim 2020-08-12 14:57:12.027879135 +0200 *************** *** 1752,1757 **** --- 1752,1772 ---- "vim9script", "let x = substitute ('x', 'x', 'x', 'x')" ], 'E121:') + + let auto_lines =<< trim END + def g:some#func(): string + return 'found' + enddef + END + mkdir('Xruntime/autoload', 'p') + writefile(auto_lines, 'Xruntime/autoload/some.vim') + let save_rtp = &rtp + &rtp = getcwd() .. '/Xruntime,' .. &rtp + assert_equal('found', g:some#func()) + assert_equal('found', some#func()) + + &rtp = save_rtp + delete('Xruntime', 'rf') enddef *** ../vim-8.2.1425/src/version.c 2020-08-12 14:21:06.263590410 +0200 --- src/version.c 2020-08-12 14:51:04.333082234 +0200 *************** *** 756,757 **** --- 756,759 ---- { /* Add new patch number below this line */ + /**/ + 1426, /**/ -- hundred-and-one symptoms of being an internet addict: 177. You log off of your system because it's time to go to work. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///