]> granicus.if.org Git - vim/commitdiff
patch 8.2.1282: Vim9: crash when using CheckScriptFailure() v8.2.1282
authorBram Moolenaar <Bram@vim.org>
Thu, 23 Jul 2020 16:26:30 +0000 (18:26 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 23 Jul 2020 16:26:30 +0000 (18:26 +0200)
Problem:    Vim9: crash when using CheckScriptFailure() in
            Test_vim9script_call_fail_decl().
Solution:   Do not decrement the def_functions len unless the function was
            newly added.

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

index ed5972185b81df9638c13cfb1a48797aebaf8562..25c40c8b98b22925f05d4f941fc1717cd1279474 100644 (file)
@@ -258,7 +258,7 @@ endfunc
 
 def Test_call_funcref()
   assert_equal(3, g:SomeFunc('abc'))
-  assert_fails('NotAFunc()', 'E117:')
+  assert_fails('NotAFunc()', 'E117:') # comment after call
   assert_fails('g:NotAFunc()', 'E117:')
 
   let lines =<< trim END
@@ -425,9 +425,7 @@ def Test_vim9script_call_fail_decl()
     enddef
     defcompile
   END
-  writefile(lines, 'Xcall_decl.vim')
-  assert_fails('source Xcall_decl.vim', 'E1054:')
-  delete('Xcall_decl.vim')
+  CheckScriptFailure(lines, 'E1054:')
 enddef
 
 def Test_vim9script_call_fail_type()
index 4286eb0b39bb5b9836daed1f6f53ad64de8049d3..4ef305162eb8d1feb7d92faebb44a9af0ff6a274 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1282,
 /**/
     1281,
 /**/
index 394433a1274c7802b956c8c8b943cd59a9a2ed2e..0fe0b16ddb7a8051a9dd7aaa683da6728039aebd 100644 (file)
@@ -6945,6 +6945,7 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
     sctx_T     save_current_sctx = current_sctx;
     int                do_estack_push;
     int                emsg_before = called_emsg;
+    int                new_def_function = FALSE;
 
     // When using a function that was compiled before: Free old instructions.
     // Otherwise add a new entry in "def_functions".
@@ -6954,8 +6955,12 @@ compile_def_function(ufunc_T *ufunc, int set_return_type, cctx_T *outer_cctx)
                                                         + ufunc->uf_dfunc_idx;
        delete_def_function_contents(dfunc);
     }
-    else if (add_def_function(ufunc) == FAIL)
-       return FAIL;
+    else
+    {
+       if (add_def_function(ufunc) == FAIL)
+           return FAIL;
+       new_def_function = TRUE;
+    }
 
     ufunc->uf_def_status = UF_COMPILING;
 
@@ -7439,10 +7444,14 @@ erret:
            delete_instr(((isn_T *)instr->ga_data) + idx);
        ga_clear(instr);
 
-       // if using the last entry in the table we might as well remove it
-       if (!dfunc->df_deleted
+       // If using the last entry in the table and it was added above, we
+       // might as well remove it.
+       if (!dfunc->df_deleted && new_def_function
                            && ufunc->uf_dfunc_idx == def_functions.ga_len - 1)
+       {
            --def_functions.ga_len;
+           ufunc->uf_dfunc_idx = 0;
+       }
        ufunc->uf_def_status = UF_NOT_COMPILED;
 
        while (cctx.ctx_scope != NULL)