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:
@@ -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()
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user