mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 9.0.0386: some code blocks are nested too deep
Problem: Some code blocks are nested too deep. Solution: Bail out earlier. (Yegappan Lakshmanan, closes #11058)
This commit is contained in:
committed by
Bram Moolenaar
parent
c47b16a470
commit
b1f471ee20
18
src/alloc.c
18
src/alloc.c
@@ -87,8 +87,9 @@ vim_mem_profile_dump(void)
|
||||
j = 0;
|
||||
for (i = 0; i < MEM_SIZES - 1; i++)
|
||||
{
|
||||
if (mem_allocs[i] || mem_frees[i])
|
||||
{
|
||||
if (mem_allocs[i] == 0 && mem_frees[i] == 0)
|
||||
continue;
|
||||
|
||||
if (mem_frees[i] > mem_allocs[i])
|
||||
printf("\r\n%s", _("ERROR: "));
|
||||
printf("[%4d / %4lu-%-4lu] ", i + 1, mem_allocs[i], mem_frees[i]);
|
||||
@@ -99,7 +100,6 @@ vim_mem_profile_dump(void)
|
||||
printf("\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
i = MEM_SIZES - 1;
|
||||
if (mem_allocs[i])
|
||||
@@ -332,8 +332,9 @@ mem_realloc(void *ptr, size_t size)
|
||||
void
|
||||
do_outofmem_msg(size_t size)
|
||||
{
|
||||
if (!did_outofmem_msg)
|
||||
{
|
||||
if (did_outofmem_msg)
|
||||
return;
|
||||
|
||||
// Don't hide this message
|
||||
emsg_silent = 0;
|
||||
|
||||
@@ -347,7 +348,6 @@ do_outofmem_msg(size_t size)
|
||||
// Not even finished with initializations and already out of
|
||||
// memory? Then nothing is going to work, exit.
|
||||
mch_exit(123);
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(EXITFREE) || defined(PROTO)
|
||||
@@ -780,8 +780,9 @@ ga_concat_strings(garray_T *gap, char *sep)
|
||||
len += (int)STRLEN(((char_u **)(gap->ga_data))[i]) + sep_len;
|
||||
|
||||
s = alloc(len + 1);
|
||||
if (s != NULL)
|
||||
{
|
||||
if (s == NULL)
|
||||
return NULL;
|
||||
|
||||
*s = NUL;
|
||||
p = s;
|
||||
for (i = 0; i < gap->ga_len; ++i)
|
||||
@@ -794,7 +795,6 @@ ga_concat_strings(garray_T *gap, char *sep)
|
||||
STRCPY(p, ((char_u **)(gap->ga_data))[i]);
|
||||
p += STRLEN(p);
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
|
130
src/arglist.c
130
src/arglist.c
@@ -105,13 +105,14 @@ alist_expand(int *fnum_list, int fnum_len)
|
||||
char_u *save_p_su = p_su;
|
||||
int i;
|
||||
|
||||
old_arg_files = ALLOC_MULT(char_u *, GARGCOUNT);
|
||||
if (old_arg_files == NULL)
|
||||
return;
|
||||
|
||||
// Don't use 'suffixes' here. This should work like the shell did the
|
||||
// expansion. Also, the vimrc file isn't read yet, thus the user
|
||||
// can't set the options.
|
||||
p_su = empty_option;
|
||||
old_arg_files = ALLOC_MULT(char_u *, GARGCOUNT);
|
||||
if (old_arg_files != NULL)
|
||||
{
|
||||
for (i = 0; i < GARGCOUNT; ++i)
|
||||
old_arg_files[i] = vim_strsave(GARGLIST[i].ae_fname);
|
||||
old_arg_count = GARGCOUNT;
|
||||
@@ -124,7 +125,6 @@ alist_expand(int *fnum_list, int fnum_len)
|
||||
TRUE, fnum_list, fnum_len);
|
||||
FreeWild(old_arg_count, old_arg_files);
|
||||
}
|
||||
}
|
||||
p_su = save_p_su;
|
||||
}
|
||||
#endif
|
||||
@@ -384,54 +384,23 @@ alist_add_list(
|
||||
}
|
||||
|
||||
/*
|
||||
* "what" == AL_SET: Redefine the argument list to 'str'.
|
||||
* "what" == AL_ADD: add files in 'str' to the argument list after "after".
|
||||
* "what" == AL_DEL: remove files in 'str' from the argument list.
|
||||
*
|
||||
* Return FAIL for failure, OK otherwise.
|
||||
* Delete the file names in 'alist_ga' from the argument list.
|
||||
*/
|
||||
static int
|
||||
do_arglist(
|
||||
char_u *str,
|
||||
int what,
|
||||
int after UNUSED, // 0 means before first one
|
||||
int will_edit) // will edit added argument
|
||||
static void
|
||||
arglist_del_files(garray_T *alist_ga)
|
||||
{
|
||||
garray_T new_ga;
|
||||
int exp_count;
|
||||
char_u **exp_files;
|
||||
regmatch_T regmatch;
|
||||
int didone;
|
||||
int i;
|
||||
char_u *p;
|
||||
int match;
|
||||
int arg_escaped = TRUE;
|
||||
|
||||
if (check_arglist_locked() == FAIL)
|
||||
return FAIL;
|
||||
|
||||
// Set default argument for ":argadd" command.
|
||||
if (what == AL_ADD && *str == NUL)
|
||||
{
|
||||
if (curbuf->b_ffname == NULL)
|
||||
return FAIL;
|
||||
str = curbuf->b_fname;
|
||||
arg_escaped = FALSE;
|
||||
}
|
||||
|
||||
// Collect all file name arguments in "new_ga".
|
||||
if (get_arglist(&new_ga, str, arg_escaped) == FAIL)
|
||||
return FAIL;
|
||||
|
||||
if (what == AL_DEL)
|
||||
{
|
||||
regmatch_T regmatch;
|
||||
int didone;
|
||||
|
||||
// Delete the items: use each item as a regexp and find a match in the
|
||||
// argument list.
|
||||
regmatch.rm_ic = p_fic; // ignore case when 'fileignorecase' is set
|
||||
for (i = 0; i < new_ga.ga_len && !got_int; ++i)
|
||||
for (i = 0; i < alist_ga->ga_len && !got_int; ++i)
|
||||
{
|
||||
p = ((char_u **)new_ga.ga_data)[i];
|
||||
p = ((char_u **)alist_ga->ga_data)[i];
|
||||
p = file_pat_to_reg_pat(p, NULL, NULL, FALSE);
|
||||
if (p == NULL)
|
||||
break;
|
||||
@@ -460,10 +429,49 @@ do_arglist(
|
||||
vim_regfree(regmatch.regprog);
|
||||
vim_free(p);
|
||||
if (!didone)
|
||||
semsg(_(e_no_match_str_2), ((char_u **)new_ga.ga_data)[i]);
|
||||
semsg(_(e_no_match_str_2), ((char_u **)alist_ga->ga_data)[i]);
|
||||
}
|
||||
ga_clear(&new_ga);
|
||||
ga_clear(alist_ga);
|
||||
}
|
||||
|
||||
/*
|
||||
* "what" == AL_SET: Redefine the argument list to 'str'.
|
||||
* "what" == AL_ADD: add files in 'str' to the argument list after "after".
|
||||
* "what" == AL_DEL: remove files in 'str' from the argument list.
|
||||
*
|
||||
* Return FAIL for failure, OK otherwise.
|
||||
*/
|
||||
static int
|
||||
do_arglist(
|
||||
char_u *str,
|
||||
int what,
|
||||
int after UNUSED, // 0 means before first one
|
||||
int will_edit) // will edit added argument
|
||||
{
|
||||
garray_T new_ga;
|
||||
int exp_count;
|
||||
char_u **exp_files;
|
||||
int i;
|
||||
int arg_escaped = TRUE;
|
||||
|
||||
if (check_arglist_locked() == FAIL)
|
||||
return FAIL;
|
||||
|
||||
// Set default argument for ":argadd" command.
|
||||
if (what == AL_ADD && *str == NUL)
|
||||
{
|
||||
if (curbuf->b_ffname == NULL)
|
||||
return FAIL;
|
||||
str = curbuf->b_fname;
|
||||
arg_escaped = FALSE;
|
||||
}
|
||||
|
||||
// Collect all file name arguments in "new_ga".
|
||||
if (get_arglist(&new_ga, str, arg_escaped) == FAIL)
|
||||
return FAIL;
|
||||
|
||||
if (what == AL_DEL)
|
||||
arglist_del_files(&new_ga);
|
||||
else
|
||||
{
|
||||
i = expand_wildcards(new_ga.ga_len, (char_u **)new_ga.ga_data,
|
||||
@@ -576,15 +584,18 @@ ex_args(exarg_T *eap)
|
||||
}
|
||||
else if (eap->cmdidx == CMD_args)
|
||||
{
|
||||
// ":args": list arguments.
|
||||
if (ARGCOUNT > 0)
|
||||
{
|
||||
char_u **items = ALLOC_MULT(char_u *, ARGCOUNT);
|
||||
char_u **items;
|
||||
|
||||
if (items != NULL)
|
||||
{
|
||||
// Overwrite the command, for a short list there is no
|
||||
// scrolling required and no wait_return().
|
||||
// ":args": list arguments.
|
||||
if (ARGCOUNT <= 0)
|
||||
return;
|
||||
|
||||
items = ALLOC_MULT(char_u *, ARGCOUNT);
|
||||
if (items == NULL)
|
||||
return;
|
||||
|
||||
// Overwrite the command, for a short list there is no scrolling
|
||||
// required and no wait_return().
|
||||
gotocmdline(TRUE);
|
||||
|
||||
for (i = 0; i < ARGCOUNT; ++i)
|
||||
@@ -592,14 +603,14 @@ ex_args(exarg_T *eap)
|
||||
list_in_columns(items, ARGCOUNT, curwin->w_arg_idx);
|
||||
vim_free(items);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (eap->cmdidx == CMD_arglocal)
|
||||
{
|
||||
garray_T *gap = &curwin->w_alist->al_ga;
|
||||
|
||||
// ":argslocal": make a local copy of the global argument list.
|
||||
if (GA_GROW_OK(gap, GARGCOUNT))
|
||||
if (GA_GROW_FAILS(gap, GARGCOUNT))
|
||||
return;
|
||||
|
||||
for (i = 0; i < GARGCOUNT; ++i)
|
||||
if (GARGLIST[i].ae_fname != NULL)
|
||||
{
|
||||
@@ -1374,8 +1385,12 @@ f_argv(typval_T *argvars, typval_T *rettv)
|
||||
&& check_for_opt_number_arg(argvars, 1) == FAIL)))
|
||||
return;
|
||||
|
||||
if (argvars[0].v_type != VAR_UNKNOWN)
|
||||
if (argvars[0].v_type == VAR_UNKNOWN)
|
||||
{
|
||||
get_arglist_as_rettv(ARGLIST, ARGCOUNT, rettv);
|
||||
return;
|
||||
}
|
||||
|
||||
if (argvars[1].v_type == VAR_UNKNOWN)
|
||||
{
|
||||
arglist = ARGLIST;
|
||||
@@ -1406,8 +1421,5 @@ f_argv(typval_T *argvars, typval_T *rettv)
|
||||
rettv->vval.v_string = vim_strsave(alist_name(&arglist[idx]));
|
||||
else if (idx == -1)
|
||||
get_arglist_as_rettv(arglist, argcount, rettv);
|
||||
}
|
||||
else
|
||||
get_arglist_as_rettv(ARGLIST, ARGCOUNT, rettv);
|
||||
}
|
||||
#endif
|
||||
|
@@ -703,6 +703,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
386,
|
||||
/**/
|
||||
385,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user