]> granicus.if.org Git - vim/commitdiff
patch 8.2.2083: Vim9: crash when using ":silent!" and getting member fails v8.2.2083
authorBram Moolenaar <Bram@vim.org>
Wed, 2 Dec 2020 19:51:22 +0000 (20:51 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 2 Dec 2020 19:51:22 +0000 (20:51 +0100)
Problem:    Vim9: crash when using ":silent!" and getting member fails.
Solution:   Jump to on_fatal_error. (closes #7412)

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

index 554d8902a527f971295f0e46ce2f86a241f52ae6..86b57f3c13a715c23834b374e36ae3320f8e52ba 100644 (file)
@@ -1768,5 +1768,19 @@ def Test_reset_did_emsg()
   CheckScriptFailure(lines, 'E492:', 8)
 enddef
 
+def Test_abort_even_with_silent()
+  var lines =<< trim END
+      vim9script
+      g:result = 'none'
+      def Func()
+        eval {-> ''}() .. '' .. {}['X']
+        g:result = 'yes'
+      enddef
+      sil! Func()
+      assert_equal('none', g:result)
+  END
+  CheckScriptSuccess(lines)
+enddef
+
 
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index 0c049905f6cacd0d261405b109737140b4a578ae..0dfe4f064bb4144f41a9317ff0eb646f80e3d013 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2083,
 /**/
     2082,
 /**/
index ab2cf385f98ac34c77e1aeba2b7fe157ecc6076a..a9fd94e9c112641e5d2ca7c14274238072346e92 100644 (file)
@@ -2669,12 +2669,12 @@ call_def_function(
                    {
                        SOURCING_LNUM = iptr->isn_lnum;
                        semsg(_(e_dictkey), key);
-                       goto on_error;
+                       goto on_fatal_error;
                    }
                    clear_tv(tv);
                    --ectx.ec_stack.ga_len;
-                   // Clear the dict after getting the item, to avoid that it
-                   // make the item invalid.
+                   // Clear the dict only after getting the item, to avoid
+                   // that it makes the item invalid.
                    tv = STACK_TV_BOT(-1);
                    temp_tv = *tv;
                    copy_tv(&di->di_tv, tv);
@@ -2997,10 +2997,12 @@ func_return:
        continue;
 
 on_error:
+       // Jump here for an error that does not require aborting execution.
        // If "emsg_silent" is set then ignore the error.
        if (did_emsg_cumul + did_emsg == did_emsg_before && emsg_silent)
            continue;
-
+on_fatal_error:
+       // Jump here for an error that messes up the stack.
        // If we are not inside a try-catch started here, abort execution.
        if (trylevel <= trylevel_at_start)
            goto failed;