mirror of
https://github.com/vim/vim
synced 2025-07-16 01:01:58 +00:00
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:
committed by
Bram Moolenaar
parent
5e1792270a
commit
7c7e19cf50
14
src/alloc.c
14
src/alloc.c
@ -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)
|
||||
{
|
||||
|
@ -44,5 +44,6 @@ typedef enum {
|
||||
aid_newwin_wvars,
|
||||
aid_newtabpage_tvars,
|
||||
aid_blob_alloc,
|
||||
aid_get_func,
|
||||
aid_last
|
||||
} alloc_id_T;
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
|
@ -746,6 +746,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
4716,
|
||||
/**/
|
||||
4715,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user