]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.1.2418: bufnr('$') is wrong after recycling popup buffer v8.1.2418
authorBram Moolenaar <Bram@vim.org>
Tue, 10 Dec 2019 22:44:48 +0000 (23:44 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 10 Dec 2019 22:44:48 +0000 (23:44 +0100)
Problem:    bufnr('$') is wrong after recycling popup buffer.
Solution:   Sort the buffer list by buffer number. (closes #5335)

src/buffer.c
src/testdir/test_popupwin.vim
src/version.c

index 4f38f918f03e45f71e648a868c3aa5fc4ce19301..b4992dda0747f4a50fa3e98ec372c304761bee3a 100644 (file)
@@ -2093,6 +2093,25 @@ buflist_new(
            // buffer number grows rapidly.
            --buf_reuse.ga_len;
            buf->b_fnum = ((int *)buf_reuse.ga_data)[buf_reuse.ga_len];
+
+           // Move buffer to the right place in the buffer list.
+           while (buf->b_prev != NULL && buf->b_fnum < buf->b_prev->b_fnum)
+           {
+               buf_T   *prev = buf->b_prev;
+
+               prev->b_next = buf->b_next;
+               if (prev->b_next != NULL)
+                   prev->b_next->b_prev = prev;
+               buf->b_next = prev;
+               buf->b_prev = prev->b_prev;
+               if (buf->b_prev != NULL)
+                   buf->b_prev->b_next = buf;
+               prev->b_prev = buf;
+               if (lastbuf == buf)
+                   lastbuf = prev;
+               if (firstbuf == prev)
+                   firstbuf = buf;
+           }
        }
        else
            buf->b_fnum = top_file_num++;
index dc22743462bf95be1e73313c804c87118e9c8fa9..5d7f46f9a37acbe9caf9a604caaa5bc0a0747db2 100644 (file)
@@ -3168,4 +3168,21 @@ func Test_popupwin_sign()
   call delete('XtestPopupSign')
 endfunc
 
+func Test_popupwin_bufnr()
+  let popwin = popup_create(['blah'], #{})
+  let popbuf = winbufnr(popwin)
+  split asdfasdf
+  let newbuf = bufnr()
+  call assert_true(newbuf > popbuf, 'New buffer number is higher')
+  call assert_equal(newbuf, bufnr('$'))
+  call popup_clear()
+  let popwin = popup_create(['blah'], #{})
+  " reuses previous buffer number
+  call assert_equal(popbuf, winbufnr(popwin))
+  call assert_equal(newbuf, bufnr('$'))
+
+  call popup_clear()
+  bwipe!
+endfunc
+
 " vim: shiftwidth=2 sts=2
index 0956f8721ba37db9523f1c7db7c7548b9ab35ac1..ecdcb9c7faa9ec7f436fea13dd816e5fdba1cd92 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2418,
 /**/
     2417,
 /**/