mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04: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;
|
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
|
int
|
||||||
ga_grow_inner(garray_T *gap, int n)
|
ga_grow_inner(garray_T *gap, int n)
|
||||||
{
|
{
|
||||||
|
@@ -44,5 +44,6 @@ typedef enum {
|
|||||||
aid_newwin_wvars,
|
aid_newwin_wvars,
|
||||||
aid_newtabpage_tvars,
|
aid_newtabpage_tvars,
|
||||||
aid_blob_alloc,
|
aid_blob_alloc,
|
||||||
|
aid_get_func,
|
||||||
aid_last
|
aid_last
|
||||||
} alloc_id_T;
|
} 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_init(garray_T *gap);
|
||||||
void ga_init2(garray_T *gap, size_t itemsize, int growsize);
|
void ga_init2(garray_T *gap, size_t itemsize, int growsize);
|
||||||
int ga_grow(garray_T *gap, int n);
|
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);
|
int ga_grow_inner(garray_T *gap, int n);
|
||||||
char_u *ga_concat_strings(garray_T *gap, char *sep);
|
char_u *ga_concat_strings(garray_T *gap, char *sep);
|
||||||
int ga_copy_string(garray_T *gap, char_u *p);
|
int ga_copy_string(garray_T *gap, char_u *p);
|
||||||
|
@@ -499,4 +499,34 @@ func Test_func_range()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
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
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@@ -4071,6 +4071,22 @@ def Test_go_beyond_end_of_cmd()
|
|||||||
v9.CheckScriptFailure(lines, 'E476:')
|
v9.CheckScriptFailure(lines, 'E476:')
|
||||||
enddef
|
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.
|
" The following messes up syntax highlight, keep near the end.
|
||||||
if has('python3')
|
if has('python3')
|
||||||
def Test_python3_command()
|
def Test_python3_command()
|
||||||
|
@@ -1092,7 +1092,7 @@ get_function_body(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add the line to the function.
|
// 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;
|
goto theend;
|
||||||
|
|
||||||
if (heredoc_concat_len > 0)
|
if (heredoc_concat_len > 0)
|
||||||
|
@@ -746,6 +746,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 */
|
||||||
|
/**/
|
||||||
|
4716,
|
||||||
/**/
|
/**/
|
||||||
4715,
|
4715,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user