]> granicus.if.org Git - vim/commitdiff
patch 8.2.1428: Vim9: :def function does not abort on nested function error v8.2.1428
authorBram Moolenaar <Bram@vim.org>
Wed, 12 Aug 2020 14:38:10 +0000 (16:38 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 12 Aug 2020 14:38:10 +0000 (16:38 +0200)
Problem:    Vim9: :def function does not abort on nested function error.
Solution:   Check whether an error message was given. (closes #6691)

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

index d30511c394d6236547d32152156d6d9079ac2811..8742883e16952e8dac4f18dca7a2df900dbe8c3e 100644 (file)
@@ -1054,6 +1054,24 @@ def Test_throw_vimscript()
   CheckScriptSuccess(lines)
 enddef
 
+def Test_error_in_nested_function()
+  # an error in a nested :function aborts executin in the calling :def function
+  let lines =<< trim END
+      vim9script
+      def Func()
+        Error()
+        g:test_var = 1
+      enddef
+      func Error() abort
+        eval [][0]
+      endfunc
+      Func()
+  END
+  g:test_var = 0
+  CheckScriptFailure(lines, 'E684:')
+  assert_equal(0, g:test_var)
+enddef
+
 def Test_cexpr_vimscript()
   # only checks line continuation
   set errorformat=File\ %f\ line\ %l
index 63c9c3d30b2425d323421d193b994243026b7ad4..46d027d14ec6327457674c8dee9226bedcadd6c3 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1428,
 /**/
     1427,
 /**/
index fed7fed0e64faef7d73ca1aa1066074ae18171d1..00adff3850d816d60df19c1fdd2e58f98fecc4ca 100644 (file)
@@ -505,6 +505,7 @@ call_ufunc(ufunc_T *ufunc, int argcount, ectx_T *ectx, isn_T *iptr)
     funcexe_T   funcexe;
     int                error;
     int                idx;
+    int                called_emsg_before = called_emsg;
 
     if (ufunc->uf_def_status == UF_TO_BE_COMPILED
            && compile_def_function(ufunc, FALSE, NULL) == FAIL)
@@ -542,6 +543,9 @@ call_ufunc(ufunc_T *ufunc, int argcount, ectx_T *ectx, isn_T *iptr)
        user_func_error(error, ufunc->uf_name);
        return FAIL;
     }
+    if (called_emsg > called_emsg_before)
+       // Error other than from calling the function itself.
+       return FAIL;
     return OK;
 }
 
@@ -670,10 +674,11 @@ store_var(char_u *name, typval_T *tv)
     static int
 call_eval_func(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
 {
-    int                called_emsg_before = called_emsg;
+    int            called_emsg_before = called_emsg;
+    int            res;
 
-    if (call_by_name(name, argcount, ectx, iptr) == FAIL
-                                         && called_emsg == called_emsg_before)
+    res = call_by_name(name, argcount, ectx, iptr);
+    if (res == FAIL && called_emsg == called_emsg_before)
     {
        dictitem_T      *v;
 
@@ -690,7 +695,7 @@ call_eval_func(char_u *name, int argcount, ectx_T *ectx, isn_T *iptr)
        }
        return call_partial(&v->di_tv, argcount, ectx);
     }
-    return OK;
+    return res;
 }
 
 /*