changeset 24854:c9ccb1976049 v8.2.2965

patch 8.2.2965: Vim9: crash when calling function that failed to compile Commit: https://github.com/vim/vim/commit/b55d618f193d9f413612d8d4e62758056e842e46 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Jun 8 22:01:53 2021 +0200 patch 8.2.2965: Vim9: crash when calling function that failed to compile Problem: Vim9: crash when calling function that failed to compile. Solution: Fail when trying to call the function. (closes https://github.com/vim/vim/issues/8344)
author Bram Moolenaar <Bram@vim.org>
date Tue, 08 Jun 2021 22:15:02 +0200
parents 7368193075a1
children 723c0075e499
files src/errors.h src/testdir/test_vim9_func.vim src/version.c src/vim9compile.c
diffstat 4 files changed, 26 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/errors.h
+++ b/src/errors.h
@@ -423,3 +423,5 @@ EXTERN char e_one_argument_too_few[]
 	INIT(= N_("E1190: One argument too few"));
 EXTERN char e_nr_arguments_too_few[]
 	INIT(= N_("E1190: %d arguments too few"));
+EXTERN char e_call_to_function_that_failed_to_compile_str[]
+	INIT(= N_("E1191: Call to function that failed to compile: %s"));
--- a/src/testdir/test_vim9_func.vim
+++ b/src/testdir/test_vim9_func.vim
@@ -74,6 +74,22 @@ def TestCompilingErrorInTry()
   delete('Xdir', 'rf')
 enddef
 
+def Test_compile_error_in_called_function()
+  var lines =<< trim END
+      vim9script
+      var n: number
+      def Foo()
+        &hls = n
+      enddef
+      def Bar()
+        Foo()
+      enddef
+      silent! Foo()
+      Bar()
+  END
+  CheckScriptFailureList(lines, ['E1012:', 'E1191:'])
+enddef
+
 def Test_autoload_name_mismatch()
   var dir = 'Xdir/autoload'
   mkdir(dir, 'p')
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2965,
+/**/
     2964,
 /**/
     2963,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -1950,6 +1950,12 @@ generate_CALL(cctx_T *cctx, ufunc_T *ufu
 					       PROFILING(ufunc), NULL) == FAIL)
 	    return FAIL;
     }
+    if (ufunc->uf_def_status == UF_COMPILE_ERROR)
+    {
+	emsg_funcname(_(e_call_to_function_that_failed_to_compile_str),
+							       ufunc->uf_name);
+	return FAIL;
+    }
 
     if ((isn = generate_instr(cctx,
 		    ufunc->uf_def_status != UF_NOT_COMPILED ? ISN_DCALL