Patch 8.1.0469
Problem: Too often indexing in qf_lists[].
Solution: Use a qf_list_T pointer. (Yegappan Lakshmanan)
Files: src/quickfix.c, src/testdir/test_quickfix.vim
*** ../vim-8.1.0468/src/quickfix.c 2018-10-07 20:26:15.834185143 +0200
--- src/quickfix.c 2018-10-11 17:37:51.185959011 +0200
***************
*** 1729,1735 ****
if (!adding)
{
// Error when creating a new list. Free the new list
! qf_free(&qi->qf_lists[qi->qf_curlist]);
qi->qf_listcount--;
if (qi->qf_curlist > 0)
--qi->qf_curlist;
--- 1729,1735 ----
if (!adding)
{
// Error when creating a new list. Free the new list
! qf_free(qfl);
qi->qf_listcount--;
if (qi->qf_curlist > 0)
--qi->qf_curlist;
***************
*** 1812,1817 ****
--- 1812,1818 ----
qf_new_list(qf_info_T *qi, char_u *qf_title)
{
int i;
+ qf_list_T *qfl;
// If the current entry is not the last entry, delete entries beyond
// the current entry. This makes it possible to browse in a tree-like
***************
*** 1830,1838 ****
}
else
qi->qf_curlist = qi->qf_listcount++;
! vim_memset(&qi->qf_lists[qi->qf_curlist], 0, (size_t)(sizeof(qf_list_T)));
! qf_store_title(&qi->qf_lists[qi->qf_curlist], qf_title);
! qi->qf_lists[qi->qf_curlist].qf_id = ++last_qf_id;
}
/*
--- 1831,1840 ----
}
else
qi->qf_curlist = qi->qf_listcount++;
! qfl = &qi->qf_lists[qi->qf_curlist];
! vim_memset(qfl, 0, (size_t)(sizeof(qf_list_T)));
! qf_store_title(qfl, qf_title);
! qfl->qf_id = ++last_qf_id;
}
/*
***************
*** 2149,2154 ****
--- 2151,2157 ----
static int
qf_get_fnum(qf_info_T *qi, int qf_idx, char_u *directory, char_u *fname)
{
+ qf_list_T *qfl = &qi->qf_lists[qf_idx];
char_u *ptr = NULL;
buf_T *buf;
char_u *bufname;
***************
*** 2174,2180 ****
if (mch_getperm(ptr) < 0)
{
vim_free(ptr);
! directory = qf_guess_filepath(&qi->qf_lists[qf_idx], fname);
if (directory)
ptr = concat_fnames(directory, fname, TRUE);
else
--- 2177,2183 ----
if (mch_getperm(ptr) < 0)
{
vim_free(ptr);
! directory = qf_guess_filepath(qfl, fname);
if (directory)
ptr = concat_fnames(directory, fname, TRUE);
else
***************
*** 3757,3762 ****
--- 3760,3766 ----
ex_cwindow(exarg_T *eap)
{
qf_info_T *qi = &ql_info;
+ qf_list_T *qfl;
win_T *win;
if (is_loclist_cmd(eap->cmdidx))
***************
*** 3766,3771 ****
--- 3770,3777 ----
return;
}
+ qfl = &qi->qf_lists[qi->qf_curlist];
+
// Look for an existing quickfix window.
win = qf_find_win(qi);
***************
*** 3773,3779 ****
// close the window. If a quickfix window is not open, then open
// it if we have errors; otherwise, leave it closed.
if (qf_stack_empty(qi)
! || qi->qf_lists[qi->qf_curlist].qf_nonevalid
|| qf_list_empty(qi, qi->qf_curlist))
{
if (win != NULL)
--- 3779,3785 ----
// close the window. If a quickfix window is not open, then open
// it if we have errors; otherwise, leave it closed.
if (qf_stack_empty(qi)
! || qfl->qf_nonevalid
|| qf_list_empty(qi, qi->qf_curlist))
{
if (win != NULL)
***************
*** 3930,3935 ****
--- 3936,3942 ----
ex_copen(exarg_T *eap)
{
qf_info_T *qi = &ql_info;
+ qf_list_T *qfl;
int height;
int status = FAIL;
***************
*** 3961,3972 ****
if (qf_open_new_cwindow(qi, height) == FAIL)
return;
! qf_set_title_var(&qi->qf_lists[qi->qf_curlist]);
// Fill the buffer with the quickfix list.
qf_fill_buffer(qi, curbuf, NULL);
! curwin->w_cursor.lnum = qi->qf_lists[qi->qf_curlist].qf_index;
curwin->w_cursor.col = 0;
check_cursor();
update_topline(); // scroll to show the line
--- 3968,3980 ----
if (qf_open_new_cwindow(qi, height) == FAIL)
return;
! qfl = &qi->qf_lists[qi->qf_curlist];
! qf_set_title_var(qfl);
// Fill the buffer with the quickfix list.
qf_fill_buffer(qi, curbuf, NULL);
! curwin->w_cursor.lnum = qfl->qf_index;
curwin->w_cursor.col = 0;
check_cursor();
update_topline(); // scroll to show the line
***************
*** 4282,4295 ****
// Check if there is anything to display
if (!qf_stack_empty(qi))
{
! char_u dirname[MAXPATHL];
*dirname = NUL;
// Add one line for each error
if (old_last == NULL)
{
! qfp = qi->qf_lists[qi->qf_curlist].qf_start;
lnum = 0;
}
else
--- 4290,4304 ----
// Check if there is anything to display
if (!qf_stack_empty(qi))
{
! qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist];
! char_u dirname[MAXPATHL];
*dirname = NUL;
// Add one line for each error
if (old_last == NULL)
{
! qfp = qfl->qf_start;
lnum = 0;
}
else
***************
*** 4297,4303 ****
qfp = old_last->qf_next;
lnum = buf->b_ml.ml_line_count;
}
! while (lnum < qi->qf_lists[qi->qf_curlist].qf_count)
{
if (qf_buf_add_line(buf, lnum, qfp, dirname) == FAIL)
break;
--- 4306,4312 ----
qfp = old_last->qf_next;
lnum = buf->b_ml.ml_line_count;
}
! while (lnum < qfl->qf_count)
{
if (qf_buf_add_line(buf, lnum, qfp, dirname) == FAIL)
break;
***************
*** 4345,4353 ****
* For every change made to the quickfix list, update the changed tick.
*/
static void
! qf_list_changed(qf_info_T *qi, int qf_idx)
{
! qi->qf_lists[qf_idx].qf_changedtick++;
}
/*
--- 4354,4362 ----
* For every change made to the quickfix list, update the changed tick.
*/
static void
! qf_list_changed(qf_list_T *qfl)
{
! qfl->qf_changedtick++;
}
/*
***************
*** 4595,4601 ****
goto cleanup;
}
if (res >= 0)
! qf_list_changed(qi, qi->qf_curlist);
// Remember the current quickfix list identifier, so that we can
// check for autocommands changing the current quickfix list.
--- 4604,4610 ----
goto cleanup;
}
if (res >= 0)
! qf_list_changed(&qi->qf_lists[qi->qf_curlist]);
// Remember the current quickfix list identifier, so that we can
// check for autocommands changing the current quickfix list.
***************
*** 4620,4625 ****
--- 4629,4635 ----
qf_get_size(exarg_T *eap)
{
qf_info_T *qi = &ql_info;
+ qf_list_T *qfl;
qfline_T *qfp;
int i, sz = 0;
int prev_fnum = 0;
***************
*** 4632,4639 ****
return 0;
}
! for (i = 0, qfp = qi->qf_lists[qi->qf_curlist].qf_start;
! i < qi->qf_lists[qi->qf_curlist].qf_count && qfp != NULL;
++i, qfp = qfp->qf_next)
{
if (qfp->qf_valid)
--- 4642,4649 ----
return 0;
}
! qfl = &qi->qf_lists[qi->qf_curlist];
! for (i = 0, qfp = qfl->qf_start; i < qfl->qf_count && qfp != NULL;
++i, qfp = qfp->qf_next)
{
if (qfp->qf_valid)
***************
*** 4935,4941 ****
return;
}
if (res >= 0)
! qf_list_changed(qi, qi->qf_curlist);
save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
if (au_name != NULL)
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, NULL, FALSE, curbuf);
--- 4945,4951 ----
return;
}
if (res >= 0)
! qf_list_changed(&qi->qf_lists[qi->qf_curlist]);
save_qfid = qi->qf_lists[qi->qf_curlist].qf_id;
if (au_name != NULL)
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name, NULL, FALSE, curbuf);
***************
*** 5204,5209 ****
--- 5214,5220 ----
char_u *p;
int fi;
qf_info_T *qi = &ql_info;
+ qf_list_T *qfl;
int_u save_qfid;
win_T *wp = NULL;
buf_T *buf;
***************
*** 5410,5419 ****
FreeWild(fcount, fnames);
! qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
! qi->qf_lists[qi->qf_curlist].qf_ptr =
qi->qf_lists[qi->qf_curlist].qf_start;
! qi->qf_lists[qi->qf_curlist].qf_index = 1;
! qf_list_changed(qi, qi->qf_curlist);
qf_update_buffer(qi, NULL);
--- 5421,5431 ----
FreeWild(fcount, fnames);
! qfl = &qi->qf_lists[qi->qf_curlist];
! qfl->qf_nonevalid = FALSE;
! qfl->qf_ptr = qfl->qf_start;
! qfl->qf_index = 1;
! qf_list_changed(qfl);
qf_update_buffer(qi, NULL);
***************
*** 5915,5921 ****
status = dict_add_number(retdict, "size", 0);
if ((status == OK) && (flags & QF_GETLIST_TICK))
status = dict_add_number(retdict, "changedtick", 0);
! if ((status == OK) && (qi != &ql_info) && (flags & QF_GETLIST_FILEWINID))
status = dict_add_number(retdict, "filewinid", 0);
return status;
--- 5927,5933 ----
status = dict_add_number(retdict, "size", 0);
if ((status == OK) && (flags & QF_GETLIST_TICK))
status = dict_add_number(retdict, "changedtick", 0);
! if ((status == OK) && IS_LL_STACK(qi) && (flags & QF_GETLIST_FILEWINID))
status = dict_add_number(retdict, "filewinid", 0);
return status;
***************
*** 5925,5933 ****
* Return the quickfix list title as 'title' in retdict
*/
static int
! qf_getprop_title(qf_info_T *qi, int qf_idx, dict_T *retdict)
{
! return dict_add_string(retdict, "title", qi->qf_lists[qf_idx].qf_title);
}
/*
--- 5937,5945 ----
* Return the quickfix list title as 'title' in retdict
*/
static int
! qf_getprop_title(qf_list_T *qfl, dict_T *retdict)
{
! return dict_add_string(retdict, "title", qfl->qf_title);
}
/*
***************
*** 5973,5989 ****
* Return the quickfix list context (if any) as 'context' in retdict.
*/
static int
! qf_getprop_ctx(qf_info_T *qi, int qf_idx, dict_T *retdict)
{
int status;
dictitem_T *di;
! if (qi->qf_lists[qf_idx].qf_ctx != NULL)
{
di = dictitem_alloc((char_u *)"context");
if (di != NULL)
{
! copy_tv(qi->qf_lists[qf_idx].qf_ctx, &di->di_tv);
status = dict_add(retdict, di);
if (status == FAIL)
dictitem_free(di);
--- 5985,6001 ----
* Return the quickfix list context (if any) as 'context' in retdict.
*/
static int
! qf_getprop_ctx(qf_list_T *qfl, dict_T *retdict)
{
int status;
dictitem_T *di;
! if (qfl->qf_ctx != NULL)
{
di = dictitem_alloc((char_u *)"context");
if (di != NULL)
{
! copy_tv(qfl->qf_ctx, &di->di_tv);
status = dict_add(retdict, di);
if (status == FAIL)
dictitem_free(di);
***************
*** 5998,6013 ****
}
/*
! * Return the quickfix list index as 'idx' in retdict
*/
static int
qf_getprop_idx(qf_info_T *qi, int qf_idx, dict_T *retdict)
{
! int idx = qi->qf_lists[qf_idx].qf_index;
if (qf_list_empty(qi, qf_idx))
! // For empty lists, qf_index is set to 1
! idx = 0;
! return dict_add_number(retdict, "idx", idx);
}
/*
--- 6010,6025 ----
}
/*
! * Return the current quickfix list index as 'idx' in retdict
*/
static int
qf_getprop_idx(qf_info_T *qi, int qf_idx, dict_T *retdict)
{
! int curidx = qi->qf_lists[qf_idx].qf_index;
if (qf_list_empty(qi, qf_idx))
! // For empty lists, current index is set to 0
! curidx = 0;
! return dict_add_number(retdict, "idx", curidx);
}
/*
***************
*** 6021,6027 ****
qf_info_T *qi = &ql_info;
qf_list_T *qfl;
int status = OK;
! int qf_idx;
dictitem_T *di;
int flags = QF_GETLIST_NONE;
--- 6033,6039 ----
qf_info_T *qi = &ql_info;
qf_list_T *qfl;
int status = OK;
! int qf_idx = INVALID_QFIDX;
dictitem_T *di;
int flags = QF_GETLIST_NONE;
***************
*** 6043,6049 ****
qfl = &qi->qf_lists[qf_idx];
if (flags & QF_GETLIST_TITLE)
! status = qf_getprop_title(qi, qf_idx, retdict);
if ((status == OK) && (flags & QF_GETLIST_NR))
status = dict_add_number(retdict, "nr", qf_idx + 1);
if ((status == OK) && (flags & QF_GETLIST_WINID))
--- 6055,6061 ----
qfl = &qi->qf_lists[qf_idx];
if (flags & QF_GETLIST_TITLE)
! status = qf_getprop_title(qfl, retdict);
if ((status == OK) && (flags & QF_GETLIST_NR))
status = dict_add_number(retdict, "nr", qf_idx + 1);
if ((status == OK) && (flags & QF_GETLIST_WINID))
***************
*** 6051,6057 ****
if ((status == OK) && (flags & QF_GETLIST_ITEMS))
status = qf_getprop_items(qi, qf_idx, retdict);
if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
! status = qf_getprop_ctx(qi, qf_idx, retdict);
if ((status == OK) && (flags & QF_GETLIST_ID))
status = dict_add_number(retdict, "id", qfl->qf_id);
if ((status == OK) && (flags & QF_GETLIST_IDX))
--- 6063,6069 ----
if ((status == OK) && (flags & QF_GETLIST_ITEMS))
status = qf_getprop_items(qi, qf_idx, retdict);
if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
! status = qf_getprop_ctx(qfl, retdict);
if ((status == OK) && (flags & QF_GETLIST_ID))
status = dict_add_number(retdict, "id", qfl->qf_id);
if ((status == OK) && (flags & QF_GETLIST_IDX))
***************
*** 6277,6288 ****
static int
qf_setprop_title(qf_info_T *qi, int qf_idx, dict_T *what, dictitem_T *di)
{
if (di->di_tv.v_type != VAR_STRING)
return FAIL;
! vim_free(qi->qf_lists[qf_idx].qf_title);
! qi->qf_lists[qf_idx].qf_title =
! get_dict_string(what, (char_u *)"title", TRUE);
if (qf_idx == qi->qf_curlist)
qf_update_win_titlevar(qi);
--- 6289,6301 ----
static int
qf_setprop_title(qf_info_T *qi, int qf_idx, dict_T *what, dictitem_T *di)
{
+ qf_list_T *qfl = &qi->qf_lists[qf_idx];
+
if (di->di_tv.v_type != VAR_STRING)
return FAIL;
! vim_free(qfl->qf_title);
! qfl->qf_title = get_dict_string(what, (char_u *)"title", TRUE);
if (qf_idx == qi->qf_curlist)
qf_update_win_titlevar(qi);
***************
*** 6375,6380 ****
--- 6388,6394 ----
int retval = FAIL;
int qf_idx;
int newlist = FALSE;
+ qf_list_T *qfl;
if (action == ' ' || qf_stack_empty(qi))
newlist = TRUE;
***************
*** 6390,6395 ****
--- 6404,6410 ----
qf_idx = qi->qf_curlist;
}
+ qfl = &qi->qf_lists[qf_idx];
if ((di = dict_find(what, (char_u *)"title", -1)) != NULL)
retval = qf_setprop_title(qi, qf_idx, what, di);
if ((di = dict_find(what, (char_u *)"items", -1)) != NULL)
***************
*** 6397,6413 ****
if ((di = dict_find(what, (char_u *)"lines", -1)) != NULL)
retval = qf_setprop_items_from_lines(qi, qf_idx, what, di, action);
if ((di = dict_find(what, (char_u *)"context", -1)) != NULL)
! retval = qf_setprop_context(&qi->qf_lists[qf_idx], di);
if (retval == OK)
! qf_list_changed(qi, qf_idx);
return retval;
}
/*
! * Find the non-location list window with the specified location list in the
! * current tabpage.
*/
static win_T *
find_win_with_ll(qf_info_T *qi)
--- 6412,6428 ----
if ((di = dict_find(what, (char_u *)"lines", -1)) != NULL)
retval = qf_setprop_items_from_lines(qi, qf_idx, what, di, action);
if ((di = dict_find(what, (char_u *)"context", -1)) != NULL)
! retval = qf_setprop_context(qfl, di);
if (retval == OK)
! qf_list_changed(qfl);
return retval;
}
/*
! * Find the non-location list window with the specified location list stack in
! * the current tabpage.
*/
static win_T *
find_win_with_ll(qf_info_T *qi)
***************
*** 6508,6514 ****
{
retval = qf_add_entries(qi, qi->qf_curlist, list, title, action);
if (retval == OK)
! qf_list_changed(qi, qi->qf_curlist);
}
return retval;
--- 6523,6529 ----
{
retval = qf_add_entries(qi, qi->qf_curlist, list, title, action);
if (retval == OK)
! qf_list_changed(&qi->qf_lists[qi->qf_curlist]);
}
return retval;
***************
*** 6654,6660 ****
eap->line1, eap->line2,
qf_title, NULL);
if (res >= 0)
! qf_list_changed(qi, qi->qf_curlist);
// Remember the current quickfix list identifier, so that we can
// check for autocommands changing the current quickfix list.
--- 6669,6675 ----
eap->line1, eap->line2,
qf_title, NULL);
if (res >= 0)
! qf_list_changed(&qi->qf_lists[qi->qf_curlist]);
// Remember the current quickfix list identifier, so that we can
// check for autocommands changing the current quickfix list.
***************
*** 6737,6743 ****
(linenr_T)0, (linenr_T)0,
qf_cmdtitle(*eap->cmdlinep), NULL);
if (res >= 0)
! qf_list_changed(qi, qi->qf_curlist);
// Remember the current quickfix list identifier, so that we can
// check for autocommands changing the current quickfix list.
--- 6752,6758 ----
(linenr_T)0, (linenr_T)0,
qf_cmdtitle(*eap->cmdlinep), NULL);
if (res >= 0)
! qf_list_changed(&qi->qf_lists[qi->qf_curlist]);
// Remember the current quickfix list identifier, so that we can
// check for autocommands changing the current quickfix list.
***************
*** 7013,7018 ****
--- 7028,7035 ----
regmatch.rm_ic = FALSE;
if (regmatch.regprog != NULL)
{
+ qf_list_T *qfl;
+
// create a new quickfix list
qf_new_list(qi, qf_cmdtitle(*eap->cmdlinep));
***************
*** 7020,7029 ****
vim_regfree(regmatch.regprog);
! qi->qf_lists[qi->qf_curlist].qf_nonevalid = FALSE;
! qi->qf_lists[qi->qf_curlist].qf_ptr =
! qi->qf_lists[qi->qf_curlist].qf_start;
! qi->qf_lists[qi->qf_curlist].qf_index = 1;
}
if (p_cpo == empty_option)
--- 7037,7048 ----
vim_regfree(regmatch.regprog);
! qfl = &qi->qf_lists[qi->qf_curlist];
! qfl->qf_nonevalid = FALSE;
! qfl->qf_ptr = qfl->qf_start;
! qfl->qf_index = 1;
! qf_list_changed(qfl);
! qf_update_buffer(qi, NULL);
}
if (p_cpo == empty_option)
***************
*** 7032,7040 ****
// Darn, some plugin changed the value.
free_string_option(save_cpo);
- qf_list_changed(qi, qi->qf_curlist);
- qf_update_buffer(qi, NULL);
-
if (au_name != NULL)
{
apply_autocmds(EVENT_QUICKFIXCMDPOST, au_name,
--- 7051,7056 ----
*** ../vim-8.1.0468/src/testdir/test_quickfix.vim 2018-09-02
15:18:38.910627833 +0200
--- src/testdir/test_quickfix.vim 2018-10-11 17:37:31.930172891 +0200
***************
*** 558,563 ****
--- 558,565 ----
" Search for non existing help string
call assert_fails('Xhelpgrep a1b2c3', 'E480:')
+ " Invalid regular expression
+ call assert_fails('Xhelpgrep \@<!', 'E480:')
endfunc
func Test_helpgrep()
*** ../vim-8.1.0468/src/version.c 2018-10-09 21:49:30.447622031 +0200
--- src/version.c 2018-10-11 17:38:14.761699178 +0200
***************
*** 794,795 ****
--- 794,797 ----
{ /* Add new patch number below this line */
+ /**/
+ 469,
/**/
--
hundred-and-one symptoms of being an internet addict:
188. You purchase a laptop so you can surf while sitting on the can.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.