summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0892
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0892')
-rw-r--r--data/vim/patches/8.1.0892518
1 files changed, 518 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0892 b/data/vim/patches/8.1.0892
new file mode 100644
index 000000000..ec187501f
--- /dev/null
+++ b/data/vim/patches/8.1.0892
@@ -0,0 +1,518 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0892
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0892
+Problem: Failure when closing a window when location list is in use.
+Solution: Handle the situation gracefully. Make sure memory for 'switchbuf'
+ is not freed at the wrong time. (Yegappan Lakshmanan,
+ closes #3928)
+Files: src/eval.c, src/evalfunc.c, src/proto/window.pro, src/quickfix.c,
+ src/testdir/test_quickfix.vim, src/window.c
+
+
+*** ../vim-8.1.0891/src/eval.c 2019-02-10 22:14:24.184352831 +0100
+--- src/eval.c 2019-02-10 22:55:04.745658531 +0100
+***************
+*** 8587,8593 ****
+ int nr = (int)tv_get_number_chk(vp, NULL);
+
+ if (nr >= LOWEST_WIN_ID)
+! return win_id2wp(vp);
+ return find_win_by_nr(vp, NULL);
+ }
+
+--- 8587,8593 ----
+ int nr = (int)tv_get_number_chk(vp, NULL);
+
+ if (nr >= LOWEST_WIN_ID)
+! return win_id2wp(tv_get_number(vp));
+ return find_win_by_nr(vp, NULL);
+ }
+
+*** ../vim-8.1.0891/src/evalfunc.c 2019-02-08 14:33:54.822761996 +0100
+--- src/evalfunc.c 2019-02-10 22:55:04.745658531 +0100
+***************
+*** 5800,5806 ****
+
+ if (argvars[0].v_type != VAR_UNKNOWN)
+ {
+! wparg = win_id2wp(argvars);
+ if (wparg == NULL)
+ return;
+ }
+--- 5800,5806 ----
+
+ if (argvars[0].v_type != VAR_UNKNOWN)
+ {
+! wparg = win_id2wp(tv_get_number(&argvars[0]));
+ if (wparg == NULL)
+ return;
+ }
+*** ../vim-8.1.0891/src/proto/window.pro 2018-09-13 17:26:31.091401618 +0200
+--- src/proto/window.pro 2019-02-10 22:55:04.749658501 +0100
+***************
+*** 91,97 ****
+ int win_getid(typval_T *argvars);
+ int win_gotoid(typval_T *argvars);
+ void win_id2tabwin(typval_T *argvars, list_T *list);
+! win_T *win_id2wp(typval_T *argvars);
+ int win_id2win(typval_T *argvars);
+ void win_findbuf(typval_T *argvars, list_T *list);
+ void get_framelayout(frame_T *fr, list_T *l, int outer);
+--- 91,97 ----
+ int win_getid(typval_T *argvars);
+ int win_gotoid(typval_T *argvars);
+ void win_id2tabwin(typval_T *argvars, list_T *list);
+! win_T *win_id2wp(int id);
+ int win_id2win(typval_T *argvars);
+ void win_findbuf(typval_T *argvars, list_T *list);
+ void get_framelayout(frame_T *fr, list_T *l, int outer);
+*** ../vim-8.1.0891/src/quickfix.c 2019-02-05 21:23:00.600559169 +0100
+--- src/quickfix.c 2019-02-10 22:55:04.749658501 +0100
+***************
+*** 1899,1921 ****
+ return;
+ *pqi = NULL; // Remove reference to this list
+
+ qi->qf_refcount--;
+ if (qi->qf_refcount < 1)
+ {
+ // No references to this location list.
+! // If the location list is still in use, then queue the delete request
+! // to be processed later.
+! if (quickfix_busy > 0)
+! locstack_queue_delreq(qi);
+! else
+! {
+! // If the quickfix window buffer is loaded, then wipe it
+! wipe_qf_buffer(qi);
+
+! for (i = 0; i < qi->qf_listcount; ++i)
+! qf_free(&qi->qf_lists[i]);
+! vim_free(qi);
+! }
+ }
+ }
+
+--- 1899,1922 ----
+ return;
+ *pqi = NULL; // Remove reference to this list
+
++ // If the location list is still in use, then queue the delete request
++ // to be processed later.
++ if (quickfix_busy > 0)
++ {
++ locstack_queue_delreq(qi);
++ return;
++ }
++
+ qi->qf_refcount--;
+ if (qi->qf_refcount < 1)
+ {
+ // No references to this location list.
+! // If the quickfix window buffer is loaded, then wipe it
+! wipe_qf_buffer(qi);
+
+! for (i = 0; i < qi->qf_listcount; ++i)
+! qf_free(&qi->qf_lists[i]);
+! vim_free(qi);
+ }
+ }
+
+***************
+*** 3018,3024 ****
+ qf_info_T *qi,
+ qfline_T *qf_ptr,
+ int forceit,
+! win_T *oldwin,
+ int *opened_window)
+ {
+ qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist];
+--- 3019,3025 ----
+ qf_info_T *qi,
+ qfline_T *qf_ptr,
+ int forceit,
+! int prev_winid,
+ int *opened_window)
+ {
+ qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist];
+***************
+*** 3039,3045 ****
+
+ retval = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1,
+ ECMD_HIDE + ECMD_SET_HELP,
+! oldwin == curwin ? curwin : NULL);
+ }
+ else
+ retval = buflist_getfile(qf_ptr->qf_fnum,
+--- 3040,3046 ----
+
+ retval = do_ecmd(qf_ptr->qf_fnum, NULL, NULL, NULL, (linenr_T)1,
+ ECMD_HIDE + ECMD_SET_HELP,
+! prev_winid == curwin->w_id ? curwin : NULL);
+ }
+ else
+ retval = buflist_getfile(qf_ptr->qf_fnum,
+***************
+*** 3047,3057 ****
+
+ // If a location list, check whether the associated window is still
+ // present.
+! if (qfl_type == QFLT_LOCATION && !win_valid_any_tab(oldwin))
+ {
+! emsg(_("E924: Current window was closed"));
+! *opened_window = FALSE;
+! return NOTDONE;
+ }
+
+ if (qfl_type == QFLT_QUICKFIX && !qflist_valid(NULL, save_qfid))
+--- 3048,3062 ----
+
+ // If a location list, check whether the associated window is still
+ // present.
+! if (qfl_type == QFLT_LOCATION)
+ {
+! win_T *wp = win_id2wp(prev_winid);
+! if (wp == NULL && curwin->w_llist != qi)
+! {
+! emsg(_("E924: Current window was closed"));
+! *opened_window = FALSE;
+! return NOTDONE;
+! }
+ }
+
+ if (qfl_type == QFLT_QUICKFIX && !qflist_valid(NULL, save_qfid))
+***************
+*** 3211,3217 ****
+ int qf_index,
+ qfline_T *qf_ptr,
+ int forceit,
+! win_T *oldwin,
+ int *opened_window,
+ int openfold,
+ int print_message)
+--- 3216,3222 ----
+ int qf_index,
+ qfline_T *qf_ptr,
+ int forceit,
+! int prev_winid,
+ int *opened_window,
+ int openfold,
+ int print_message)
+***************
+*** 3227,3233 ****
+
+ if (qf_ptr->qf_fnum != 0)
+ {
+! retval = qf_jump_edit_buffer(qi, qf_ptr, forceit, oldwin,
+ opened_window);
+ if (retval != OK)
+ return retval;
+--- 3232,3238 ----
+
+ if (qf_ptr->qf_fnum != 0)
+ {
+! retval = qf_jump_edit_buffer(qi, qf_ptr, forceit, prev_winid,
+ opened_window);
+ if (retval != OK)
+ return retval;
+***************
+*** 3287,3294 ****
+ int old_qf_index;
+ char_u *old_swb = p_swb;
+ unsigned old_swb_flags = swb_flags;
+ int opened_window = FALSE;
+- win_T *oldwin = curwin;
+ int print_message = TRUE;
+ #ifdef FEAT_FOLDING
+ int old_KeyTyped = KeyTyped; // getting file may reset it
+--- 3292,3299 ----
+ int old_qf_index;
+ char_u *old_swb = p_swb;
+ unsigned old_swb_flags = swb_flags;
++ int prev_winid;
+ int opened_window = FALSE;
+ int print_message = TRUE;
+ #ifdef FEAT_FOLDING
+ int old_KeyTyped = KeyTyped; // getting file may reset it
+***************
+*** 3304,3309 ****
+--- 3309,3316 ----
+ return;
+ }
+
++ incr_quickfix_busy();
++
+ qfl = &qi->qf_lists[qi->qf_curlist];
+
+ qf_ptr = qfl->qf_ptr;
+***************
+*** 3325,3337 ****
+ // window
+ print_message = FALSE;
+
+ retval = qf_jump_open_window(qi, qf_ptr, newwin, &opened_window);
+ if (retval == FAIL)
+ goto failed;
+ if (retval == NOTDONE)
+ goto theend;
+
+! retval = qf_jump_to_buffer(qi, qf_index, qf_ptr, forceit, oldwin,
+ &opened_window, old_KeyTyped, print_message);
+ if (retval == NOTDONE)
+ {
+--- 3332,3346 ----
+ // window
+ print_message = FALSE;
+
++ prev_winid = curwin->w_id;
++
+ retval = qf_jump_open_window(qi, qf_ptr, newwin, &opened_window);
+ if (retval == FAIL)
+ goto failed;
+ if (retval == NOTDONE)
+ goto theend;
+
+! retval = qf_jump_to_buffer(qi, qf_index, qf_ptr, forceit, prev_winid,
+ &opened_window, old_KeyTyped, print_message);
+ if (retval == NOTDONE)
+ {
+***************
+*** 3359,3365 ****
+ qfl->qf_ptr = qf_ptr;
+ qfl->qf_index = qf_index;
+ }
+! if (p_swb != old_swb && opened_window)
+ {
+ // Restore old 'switchbuf' value, but not when an autocommand or
+ // modeline has changed the value.
+--- 3368,3374 ----
+ qfl->qf_ptr = qf_ptr;
+ qfl->qf_index = qf_index;
+ }
+! if (p_swb != old_swb)
+ {
+ // Restore old 'switchbuf' value, but not when an autocommand or
+ // modeline has changed the value.
+***************
+*** 3371,3376 ****
+--- 3380,3386 ----
+ else
+ free_string_option(old_swb);
+ }
++ decr_quickfix_busy();
+ }
+
+ // Highlight attributes used for displaying entries from the quickfix list.
+***************
+*** 4004,4012 ****
+ if (IS_LL_STACK(qi))
+ {
+ // For the location list window, create a reference to the
+! // location list from the window 'win'.
+! curwin->w_llist_ref = win->w_llist;
+! win->w_llist->qf_refcount++;
+ }
+
+ if (oldwin != curwin)
+--- 4014,4022 ----
+ if (IS_LL_STACK(qi))
+ {
+ // For the location list window, create a reference to the
+! // location list stack from the window 'win'.
+! curwin->w_llist_ref = qi;
+! qi->qf_refcount++;
+ }
+
+ if (oldwin != curwin)
+*** ../vim-8.1.0891/src/testdir/test_quickfix.vim 2019-02-05 21:23:00.600559169 +0100
+--- src/testdir/test_quickfix.vim 2019-02-10 22:55:04.749658501 +0100
+***************
+*** 1,4 ****
+! " Test for the quickfix commands.
+
+ if !has('quickfix')
+ finish
+--- 1,4 ----
+! " Test for the quickfix feature.
+
+ if !has('quickfix')
+ finish
+***************
+*** 1419,1425 ****
+ \ {'filename': 'fnameD', 'text': 'D'},
+ \ {'filename': 'fnameE', 'text': 'E'}]
+
+! " {action} is unspecified. Same as specifing ' '.
+ new | only
+ silent! Xnewer 99
+ call g:Xsetlist(list1)
+--- 1419,1425 ----
+ \ {'filename': 'fnameD', 'text': 'D'},
+ \ {'filename': 'fnameE', 'text': 'E'}]
+
+! " {action} is unspecified. Same as specifying ' '.
+ new | only
+ silent! Xnewer 99
+ call g:Xsetlist(list1)
+***************
+*** 2348,2354 ****
+ " Open a new window and create a location list
+ " Open the location list window and close the other window
+ " Jump to an entry.
+! " Should create a new window and jump to the entry. The scrtach buffer
+ " should not be used.
+ enew | only
+ set buftype=nofile
+--- 2348,2354 ----
+ " Open a new window and create a location list
+ " Open the location list window and close the other window
+ " Jump to an entry.
+! " Should create a new window and jump to the entry. The scratch buffer
+ " should not be used.
+ enew | only
+ set buftype=nofile
+***************
+*** 3831,3837 ****
+ new | only
+
+ " When split opening files from a helpgrep location list window, a new help
+! " window should be opend with a copy of the location list.
+ lhelpgrep window
+ let locid = getloclist(0, {'id' : 0}).id
+ lwindow
+--- 3831,3837 ----
+ new | only
+
+ " When split opening files from a helpgrep location list window, a new help
+! " window should be opened with a copy of the location list.
+ lhelpgrep window
+ let locid = getloclist(0, {'id' : 0}).id
+ lwindow
+***************
+*** 3933,3940 ****
+ call assert_match(qfbnum . ' h- "\[Location List]"', execute('ls'))
+ call assert_true(bufloaded(qfbnum))
+
+ new | only
+! call assert_false(bufloaded(qfbnum))
+ endif
+ endfunc
+
+--- 3933,3962 ----
+ call assert_match(qfbnum . ' h- "\[Location List]"', execute('ls'))
+ call assert_true(bufloaded(qfbnum))
+
++ " When the location list is cleared for the window, the buffer should be
++ " removed
++ call setloclist(0, [], 'f')
++ call assert_false(bufexists(qfbnum))
++
++ " When the location list is freed with the location list window open, the
++ " location list buffer should not be lost. It should be reused when the
++ " location list is again populated.
++ lexpr "F1:10:Line10"
++ lopen
++ let wid = win_getid()
++ let qfbnum = bufnr('')
++ wincmd p
++ call setloclist(0, [], 'f')
++ lexpr "F1:10:Line10"
++ lopen
++ call assert_equal(wid, win_getid())
++ call assert_equal(qfbnum, bufnr(''))
++ lclose
++
++ " When the window with the location list is closed, the buffer should be
++ " removed
+ new | only
+! call assert_false(bufexists(qfbnum))
+ endif
+ endfunc
+
+***************
+*** 3942,3944 ****
+--- 3964,3992 ----
+ call Xqfbuf_test('c')
+ call Xqfbuf_test('l')
+ endfunc
++
++ " If there is an autocmd to use only one window, then opening the location
++ " list window used to crash Vim.
++ func Test_winonly_autocmd()
++ call s:create_test_file('Xtest1')
++ " Autocmd to show only one Vim window at a time
++ autocmd WinEnter * only
++ new
++ " Load the location list
++ lexpr "Xtest1:5:Line5\nXtest1:10:Line10\nXtest1:15:Line15"
++ let loclistid = getloclist(0, {'id' : 0}).id
++ " Open the location list window. Only this window will be shown and the file
++ " window is closed.
++ lopen
++ call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
++ " Jump to an entry in the location list and make sure that the cursor is
++ " positioned correctly.
++ ll 3
++ call assert_equal(loclistid, getloclist(0, {'id' : 0}).id)
++ call assert_equal('Xtest1', bufname(''))
++ call assert_equal(15, line('.'))
++ " Cleanup
++ autocmd! WinEnter
++ new | only
++ call delete('Xtest1')
++ endfunc
+*** ../vim-8.1.0891/src/window.c 2019-01-31 18:26:05.742803481 +0100
+--- src/window.c 2019-02-10 22:55:04.749658501 +0100
+***************
+*** 7193,7203 ****
+ }
+
+ win_T *
+! win_id2wp(typval_T *argvars)
+ {
+ win_T *wp;
+ tabpage_T *tp;
+- int id = tv_get_number(&argvars[0]);
+
+ FOR_ALL_TAB_WINDOWS(tp, wp)
+ if (wp->w_id == id)
+--- 7193,7202 ----
+ }
+
+ win_T *
+! win_id2wp(int id)
+ {
+ win_T *wp;
+ tabpage_T *tp;
+
+ FOR_ALL_TAB_WINDOWS(tp, wp)
+ if (wp->w_id == id)
+*** ../vim-8.1.0891/src/version.c 2019-02-10 22:50:08.011856775 +0100
+--- src/version.c 2019-02-10 22:55:47.289343987 +0100
+***************
+*** 785,786 ****
+--- 785,788 ----
+ { /* Add new patch number below this line */
++ /**/
++ 892,
+ /**/
+
+--
+JOHN CLEESE PLAYED: SECOND SOLDIER WITH A KEEN INTEREST IN BIRDS, LARGE MAN
+ WITH DEAD BODY, BLACK KNIGHT, MR NEWT (A VILLAGE
+ BLACKSMITH INTERESTED IN BURNING WITCHES), A QUITE
+ EXTRAORDINARILY RUDE FRENCHMAN, TIM THE WIZARD, SIR
+ LAUNCELOT
+ "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- 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 ///