0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.1282: Vim9: crash when using CheckScriptFailure()

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.
This commit is contained in:
Bram Moolenaar
2020-07-23 18:26:30 +02:00
parent 2d06bfde29
commit 6c4bfe4b31
3 changed files with 17 additions and 8 deletions

View File

@@ -258,7 +258,7 @@ endfunc
def Test_call_funcref() def Test_call_funcref()
assert_equal(3, g:SomeFunc('abc')) assert_equal(3, g:SomeFunc('abc'))
assert_fails('NotAFunc()', 'E117:') assert_fails('NotAFunc()', 'E117:') # comment after call
assert_fails('g:NotAFunc()', 'E117:') assert_fails('g:NotAFunc()', 'E117:')
let lines =<< trim END let lines =<< trim END
@@ -425,9 +425,7 @@ def Test_vim9script_call_fail_decl()
enddef enddef
defcompile defcompile
END END
writefile(lines, 'Xcall_decl.vim') CheckScriptFailure(lines, 'E1054:')
assert_fails('source Xcall_decl.vim', 'E1054:')
delete('Xcall_decl.vim')
enddef enddef
def Test_vim9script_call_fail_type() def Test_vim9script_call_fail_type()

View File

@@ -754,6 +754,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1282,
/**/ /**/
1281, 1281,
/**/ /**/

View 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; sctx_T save_current_sctx = current_sctx;
int do_estack_push; int do_estack_push;
int emsg_before = called_emsg; int emsg_before = called_emsg;
int new_def_function = FALSE;
// When using a function that was compiled before: Free old instructions. // When using a function that was compiled before: Free old instructions.
// Otherwise add a new entry in "def_functions". // 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; + ufunc->uf_dfunc_idx;
delete_def_function_contents(dfunc); delete_def_function_contents(dfunc);
} }
else if (add_def_function(ufunc) == FAIL) else
{
if (add_def_function(ufunc) == FAIL)
return FAIL; return FAIL;
new_def_function = TRUE;
}
ufunc->uf_def_status = UF_COMPILING; ufunc->uf_def_status = UF_COMPILING;
@@ -7439,10 +7444,14 @@ erret:
delete_instr(((isn_T *)instr->ga_data) + idx); delete_instr(((isn_T *)instr->ga_data) + idx);
ga_clear(instr); ga_clear(instr);
// if using the last entry in the table we might as well remove it // If using the last entry in the table and it was added above, we
if (!dfunc->df_deleted // might as well remove it.
if (!dfunc->df_deleted && new_def_function
&& ufunc->uf_dfunc_idx == def_functions.ga_len - 1) && ufunc->uf_dfunc_idx == def_functions.ga_len - 1)
{
--def_functions.ga_len; --def_functions.ga_len;
ufunc->uf_dfunc_idx = 0;
}
ufunc->uf_def_status = UF_NOT_COMPILED; ufunc->uf_def_status = UF_NOT_COMPILED;
while (cctx.ctx_scope != NULL) while (cctx.ctx_scope != NULL)