// Get some space to modify the format string into.
sz = efm_regpat_bufsz(efm);
- if ((fmtstr = alloc(sz)) == NULL)
+ if ((fmtstr = alloc_id(sz, aid_qf_efm_fmtstr)) == NULL)
goto parse_efm_error;
while (efm[0] != NUL)
{
// Allocate a new eformat structure and put it at the end of the list
- fmt_ptr = ALLOC_CLEAR_ONE(efm_T);
+ fmt_ptr = ALLOC_CLEAR_ONE_ID(efm_T, aid_qf_efm_fmtpart);
if (fmt_ptr == NULL)
goto parse_efm_error;
if (fmt_first == NULL) // first one
state->linelen = newsz > LINE_MAXLEN ? LINE_MAXLEN - 1 : newsz;
if (state->growbuf == NULL)
{
- state->growbuf = alloc(state->linelen + 1);
+ state->growbuf = alloc_id(state->linelen + 1, aid_qf_linebuf);
if (state->growbuf == NULL)
return NULL;
state->growbufsiz = state->linelen;
}
/*
- * Get the next string from state->p_Li.
+ * Get the next string from the List item state->p_li.
*/
static int
qf_get_next_list_line(qfstate_T *state)
if (state->growbuf == NULL)
{
state->growbufsiz = 2 * (IOSIZE - 1);
- state->growbuf = alloc(state->growbufsiz);
+ state->growbuf = alloc_id(state->growbufsiz, aid_qf_linebuf);
if (state->growbuf == NULL)
return QF_NOMEM;
}
if (*fields->errmsg && !qfl->qf_multiignore)
{
len = (int)STRLEN(qfprev->qf_text);
- if ((ptr = alloc(len + STRLEN(fields->errmsg) + 2))
- == NULL)
+ ptr = alloc_id(len + STRLEN(fields->errmsg) + 2,
+ aid_qf_multiline_pfx);
+ if (ptr == NULL)
return QF_FAIL;
STRCPY(ptr, qfprev->qf_text);
vim_free(qfprev->qf_text);
if (title != NULL)
{
- char_u *p = alloc(STRLEN(title) + 2);
+ char_u *p = alloc_id(STRLEN(title) + 2, aid_qf_title);
qfl->qf_title = p;
if (p != NULL)
qfline_T *qfp;
qfline_T **lastp; // pointer to qf_last or NULL
- if ((qfp = ALLOC_ONE(qfline_T)) == NULL)
+ if ((qfp = ALLOC_ONE_ID(qfline_T, aid_qf_qfline)) == NULL)
return QF_FAIL;
if (bufnum != 0)
{
{
qf_info_T *qi;
- qi = ALLOC_CLEAR_ONE(qf_info_T);
+ qi = ALLOC_CLEAR_ONE_ID(qf_info_T, aid_qf_qfinfo);
if (qi != NULL)
{
qi->qf_refcount++;
struct dir_stack_T *ds_ptr;
// allocate new stack element and hook it in
- ds_new = ALLOC_ONE(struct dir_stack_T);
+ ds_new = ALLOC_ONE_ID(struct dir_stack_T, aid_qf_dirstack);
if (ds_new == NULL)
return NULL;
else
off += 19;
- name = alloc(STRLEN(p_mef) + 30);
+ name = alloc_id(STRLEN(p_mef) + 30, aid_qf_mef_name);
if (name == NULL)
break;
STRCPY(name, p_mef);
len = (unsigned)STRLEN(p_shq) * 2 + (unsigned)STRLEN(makecmd) + 1;
if (*p_sp != NUL)
len += (unsigned)STRLEN(p_sp) + (unsigned)STRLEN(fname) + 3;
- cmd = alloc(len);
+ cmd = alloc_id(len, aid_qf_makecmd);
if (cmd == NULL)
return NULL;
sprintf((char *)cmd, "%s%s%s", (char *)p_shq, (char *)makecmd,
cmd = make_get_fullcmd(eap->arg, fname);
if (cmd == NULL)
+ {
+ vim_free(fname);
return;
+ }
// let the shell know if we are redirecting output or not
do_shell(cmd, *p_sp != NUL ? SHELL_DOOUT : 0);
call Xtest_browse('l')
endfunc
-func Test_nomem()
+" Test for memory allocation failures
+func Xnomem_tests(cchar)
+ call s:setup_commands(a:cchar)
+
call test_alloc_fail(GetAllocId('qf_dirname_start'), 0, 0)
- call assert_fails('vimgrep vim runtest.vim', 'E342:')
+ call assert_fails('Xvimgrep vim runtest.vim', 'E342:')
- call GetAllocId('qf_dirname_now')->test_alloc_fail(0, 0)
- call assert_fails('vimgrep vim runtest.vim', 'E342:')
+ call test_alloc_fail(GetAllocId('qf_dirname_now'), 0, 0)
+ call assert_fails('Xvimgrep vim runtest.vim', 'E342:')
call test_alloc_fail(GetAllocId('qf_namebuf'), 0, 0)
- call assert_fails('cfile runtest.vim', 'E342:')
+ call assert_fails('Xfile runtest.vim', 'E342:')
call test_alloc_fail(GetAllocId('qf_errmsg'), 0, 0)
- call assert_fails('cfile runtest.vim', 'E342:')
+ call assert_fails('Xfile runtest.vim', 'E342:')
call test_alloc_fail(GetAllocId('qf_pattern'), 0, 0)
- call assert_fails('cfile runtest.vim', 'E342:')
+ call assert_fails('Xfile runtest.vim', 'E342:')
+
+ call test_alloc_fail(GetAllocId('qf_efm_fmtstr'), 0, 0)
+ set efm=%f
+ call assert_fails('Xexpr ["Xfile1"]', 'E342:')
+ set efm&
+
+ call test_alloc_fail(GetAllocId('qf_efm_fmtpart'), 0, 0)
+ set efm=%f:%l:%m,%f-%l-%m
+ call assert_fails('Xaddexpr ["Xfile2", "Xfile3"]', 'E342:')
+ set efm&
+
+ call test_alloc_fail(GetAllocId('qf_title'), 0, 0)
+ call assert_fails('Xexpr ""', 'E342:')
+ call assert_equal('', g:Xgetlist({'all': 1}).title)
+
+ call test_alloc_fail(GetAllocId('qf_mef_name'), 0, 0)
+ set makeef=Xtmp##.err
+ call assert_fails('Xgrep needle haystack', 'E342:')
+ set makeef&
+
+ call test_alloc_fail(GetAllocId('qf_qfline'), 0, 0)
+ call assert_fails('Xexpr "Xfile1:10:Line10"', 'E342:')
+
+ if a:cchar == 'l'
+ for id in ['qf_qfline', 'qf_qfinfo']
+ lgetexpr ["Xfile1:10:L10", "Xfile2:20:L20"]
+ call test_alloc_fail(GetAllocId(id), 0, 0)
+ call assert_fails('new', 'E342:')
+ call assert_equal(2, winnr('$'))
+ call assert_equal([], getloclist(0))
+ %bw!
+ endfor
+ endif
+
+ call test_alloc_fail(GetAllocId('qf_qfline'), 0, 0)
+ try
+ call assert_fails('Xvimgrep vim runtest.vim', 'E342:')
+ catch /^Vim:Interrupt$/
+ endtry
+
+ call test_alloc_fail(GetAllocId('qf_qfline'), 0, 0)
+ try
+ call assert_fails('Xvimgrep /vim/f runtest.vim', 'E342:')
+ catch /^Vim:Interrupt$/
+ endtry
+
+ let l = getqflist({"lines": ["Xfile1:10:L10"]})
+ call test_alloc_fail(GetAllocId('qf_qfline'), 0, 0)
+ call assert_fails('call g:Xsetlist(l.items)', 'E342:')
+
+ call test_alloc_fail(GetAllocId('qf_qfline'), 0, 0)
+ try
+ call assert_fails('Xhelpgrep quickfix', 'E342:')
+ catch /^Vim:Interrupt$/
+ endtry
+
+ call test_alloc_fail(GetAllocId('qf_qfinfo'), 0, 0)
+ call assert_fails('let l = g:Xgetlist({"lines": ["Xfile1:10:L10"]})', 'E342:')
+ call assert_equal(#{items: []}, l)
+ if a:cchar == 'l'
+ call setqflist([], 'f')
+ call setloclist(0, [], 'f')
+ call test_alloc_fail(GetAllocId('qf_qfinfo'), 0, 0)
+ call assert_fails('lhelpgrep quickfix', 'E342:')
+ call assert_equal([], getloclist(0))
+
+ call test_alloc_fail(GetAllocId('qf_qfinfo'), 0, 0)
+ call assert_fails('lvimgrep vim runtest.vim', 'E342:')
+
+ let l = getqflist({"lines": ["Xfile1:10:L10"]})
+ call test_alloc_fail(GetAllocId('qf_qfinfo'), 0, 0)
+ call assert_fails('call setloclist(0, l.items)', 'E342:')
+
+ call test_alloc_fail(GetAllocId('qf_qfinfo'), 0, 0)
+ call assert_fails('lbuffer', 'E342:')
+
+ call test_alloc_fail(GetAllocId('qf_qfinfo'), 0, 0)
+ call assert_fails('lexpr ["Xfile1:10:L10", "Xfile2:20:L20"]', 'E342:')
+
+ call test_alloc_fail(GetAllocId('qf_qfinfo'), 0, 0)
+ call assert_fails('lfile runtest.vim', 'E342:')
+ endif
+
+ call test_alloc_fail(GetAllocId('qf_dirstack'), 0, 0)
+ set efm=%DEntering\ dir\ %f,%f:%l:%m
+ call assert_fails('Xexpr ["Entering dir abc", "abc.txt:1:Hello world"]', 'E342:')
+ set efm&
+
+ call test_alloc_fail(GetAllocId('qf_dirstack'), 0, 0)
+ set efm=%+P[%f],(%l)%m
+ call assert_fails('Xexpr ["[runtest.vim]", "(1)Hello"]', 'E342:')
+ set efm&
+
+ call test_alloc_fail(GetAllocId('qf_multiline_pfx'), 0, 0)
+ set efm=%EError,%Cline\ %l,%Z%m
+ call assert_fails('Xexpr ["Error", "line 1", "msg"]', 'E342:')
+ set efm&
+
+ call test_alloc_fail(GetAllocId('qf_makecmd'), 0, 0)
+ call assert_fails('Xgrep vim runtest.vim', 'E342:')
+
+ call test_alloc_fail(GetAllocId('qf_linebuf'), 0, 0)
+ call assert_fails('Xexpr repeat("a", 8192)', 'E342:')
+
+ call test_alloc_fail(GetAllocId('qf_linebuf'), 0, 0)
+ call assert_fails('Xexpr [repeat("a", 8192)]', 'E342:')
+
+ new
+ call setline(1, repeat('a', 8192))
+ call test_alloc_fail(GetAllocId('qf_linebuf'), 0, 0)
+ call assert_fails('Xbuffer', 'E342:')
+ %bw!
+
+ call writefile([repeat('a', 8192)], 'Xtest')
+ call test_alloc_fail(GetAllocId('qf_linebuf'), 0, 0)
+ call assert_fails('Xfile Xtest', 'E342:')
+ call delete('Xtest')
+endfunc
+
+func Test_nomem()
+ call Xnomem_tests('c')
+ call Xnomem_tests('l')
endfunc
func s:test_xhelpgrep(cchar)