patch 9.1.0556: :bwipe doesn't remove file from jumplist of other tabpages

Problem:  :bwipe doesn't remove file from jumplist and tagstack of other
          tabpages. Time complexity of mark_forget_file() is O(n^2) when
          removing all entries (after v9.1.0554)
Solution: Use FOR_ALL_TAB_WINDOWS().  Start the loops over the arrays
          from the end instead of the start (zeertzjq)

closes: #15199

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/test_jumplist.vim b/src/testdir/test_jumplist.vim
index 0f43a8c..4b9fcee 100644
--- a/src/testdir/test_jumplist.vim
+++ b/src/testdir/test_jumplist.vim
@@ -59,7 +59,7 @@
   call assert_equal(4, l[1])
 endfunc
 
-func Test_jumplist_invalid()
+func Test_jumplist_wipe_buf()
   new
   clearjumps
   " Put some random text and fill the jump list.
@@ -72,6 +72,50 @@
   call assert_equal([[], 0], getjumplist())
   let jumps = execute(':jumps')
   call assert_equal('>', jumps[-1:])
+
+  " Put some random text and fill the jump list.
+  call setline(1, ['foo', 'bar', 'baz'])
+  setl bufhidden=hide
+
+  " References to wiped buffer are deleted with multiple tabpages.
+  let [w1, t1] = [win_getid(), tabpagenr()]
+  clearjumps
+  normal G
+  normal gg
+  enew
+
+  split XXJumpListBuffer
+  let [w2, t2] = [win_getid(), tabpagenr()]
+  clearjumps
+  normal G
+  normal gg
+  enew
+
+  tabnew XXJumpListBuffer
+  let [w3, t3] = [win_getid(), tabpagenr()]
+  clearjumps
+  normal G
+  normal gg
+  enew
+
+  split XXJumpListBuffer
+  let [w4, t4] = [win_getid(), tabpagenr()]
+  clearjumps
+  normal G
+  normal gg
+  enew
+
+  for [w, t] in [[w1, t1], [w2, t2], [w3, t3], [w4, t4]]
+    call assert_equal(2, len(getjumplist(w, t)[0]))
+  endfor
+
+  bwipe! XXJumpListBuffer
+
+  for [w, t] in [[w1, t1], [w2, t2], [w3, t3], [w4, t4]]
+    call assert_equal(0, len(getjumplist(w, t)[0]))
+  endfor
+
+  %bwipe!
 endfunc
 
 " Test for '' mark in an empty buffer