patch 8.2.4716: memory allocation failure not tested when defining a function

Problem:    Memory allocation failure not tested when defining a function.
Solution:   Add a test. (Yegappan Lakshmanan, closes #10127)
This commit is contained in:
Yegappan Lakshmanan
2022-04-09 11:09:07 +01:00
committed by Bram Moolenaar
parent 5e1792270a
commit 7c7e19cf50
7 changed files with 65 additions and 1 deletions

View File

@ -719,6 +719,20 @@ ga_grow(garray_T *gap, int n)
return OK;
}
/*
* Same as ga_grow() but uses an allocation id for testing.
*/
int
ga_grow_id(garray_T *gap, int n, alloc_id_T id UNUSED)
{
#ifdef FEAT_EVAL
if (alloc_fail_id == id && alloc_does_fail(sizeof(list_T)))
return FAIL;
#endif
return ga_grow(gap, n);
}
int
ga_grow_inner(garray_T *gap, int n)
{

View File

@ -44,5 +44,6 @@ typedef enum {
aid_newwin_wvars,
aid_newtabpage_tvars,
aid_blob_alloc,
aid_get_func,
aid_last
} alloc_id_T;

View File

@ -19,6 +19,7 @@ int ga_copy_strings(garray_T *from, garray_T *to);
void ga_init(garray_T *gap);
void ga_init2(garray_T *gap, size_t itemsize, int growsize);
int ga_grow(garray_T *gap, int n);
int ga_grow_id(garray_T *gap, int n, alloc_id_T id UNUSED);
int ga_grow_inner(garray_T *gap, int n);
char_u *ga_concat_strings(garray_T *gap, char *sep);
int ga_copy_string(garray_T *gap, char_u *p);

View File

@ -499,4 +499,34 @@ func Test_func_range()
bwipe!
endfunc
" Test for memory allocation failure when defining a new function
func Test_funcdef_alloc_failure()
new
let lines =<< trim END
func Xtestfunc()
return 321
endfunc
END
call setline(1, lines)
call test_alloc_fail(GetAllocId('get_func'), 0, 0)
call assert_fails('source', 'E342:')
call assert_false(exists('*Xtestfunc'))
call assert_fails('delfunc Xtestfunc', 'E117:')
%d _
let lines =<< trim END
def g:Xvim9func(): number
return 456
enddef
END
call setline(1, lines)
call test_alloc_fail(GetAllocId('get_func'), 0, 0)
call assert_fails('source', 'E342:')
call assert_false(exists('*Xvim9func'))
"call test_alloc_fail(GetAllocId('get_func'), 0, 0)
"call assert_fails('source', 'E342:')
"call assert_false(exists('*Xtestfunc'))
"call assert_fails('delfunc Xtestfunc', 'E117:')
bw!
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@ -4071,6 +4071,22 @@ def Test_go_beyond_end_of_cmd()
v9.CheckScriptFailure(lines, 'E476:')
enddef
" Test for memory allocation failure when defining a new lambda
func Test_lambda_allocation_failure()
new
let lines =<< trim END
vim9script
g:Xlambda = (x): number => {
return x + 1
}
END
call setline(1, lines)
call test_alloc_fail(GetAllocId('get_func'), 0, 0)
call assert_fails('source', 'E342:')
call assert_false(exists('g:Xlambda'))
bw!
endfunc
" The following messes up syntax highlight, keep near the end.
if has('python3')
def Test_python3_command()

View File

@ -1092,7 +1092,7 @@ get_function_body(
}
// Add the line to the function.
if (ga_grow(newlines, 1 + sourcing_lnum_off) == FAIL)
if (ga_grow_id(newlines, 1 + sourcing_lnum_off, aid_get_func) == FAIL)
goto theend;
if (heredoc_concat_len > 0)

View File

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