patch 9.1.0166: Internal error with blockwise getregion() in another buffer

Problem:  Internal error with blockwise getregion() in another buffer
Solution: Also change curwin->w_buffer when changing curbuf (zeertzjq)

closes: #14179

Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 1b394f0..eeee00d 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -5494,10 +5494,10 @@
     int			fnum1 = -1, fnum2 = -1;
     pos_T		p1, p2;
     char_u		*type;
-    buf_T		*save_curbuf = curbuf;
-    buf_T		*findbuf = curbuf;
+    buf_T		*save_curbuf;
+    buf_T		*findbuf;
     char_u		default_type[] = "v";
-    int			save_virtual = -1;
+    int			save_virtual;
     int			l;
     int			region_type = -1;
     int			is_select_exclusive;
@@ -5542,15 +5542,11 @@
 	return;
     }
 
-    if (fnum1 != 0)
+    findbuf = fnum1 != 0 ? buflist_findnr(fnum1) : curbuf;
+    if (findbuf == NULL || findbuf->b_ml.ml_mfp == NULL)
     {
-	findbuf = buflist_findnr(fnum1);
-	// buffer not loaded
-	if (findbuf == NULL || findbuf->b_ml.ml_mfp == NULL)
-	{
-	    emsg(_(e_buffer_is_not_loaded));
-	    return;
-	}
+	emsg(_(e_buffer_is_not_loaded));
+	return;
     }
 
     if (p1.lnum < 1 || p1.lnum > findbuf->b_ml.ml_line_count)
@@ -5574,7 +5570,9 @@
 	return;
     }
 
+    save_curbuf = curbuf;
     curbuf = findbuf;
+    curwin->w_buffer = curbuf;
     save_virtual = virtual_op;
     virtual_op = virtual_active();
 
@@ -5677,9 +5675,8 @@
 	}
     }
 
-    if (curbuf != save_curbuf)
-        curbuf = save_curbuf;
-
+    curbuf = save_curbuf;
+    curwin->w_buffer = curbuf;
     virtual_op = save_virtual;
 }
 
diff --git a/src/testdir/test_visual.vim b/src/testdir/test_visual.vim
index ca13966..fd174a9 100644
--- a/src/testdir/test_visual.vim
+++ b/src/testdir/test_visual.vim
@@ -1768,11 +1768,11 @@
     for type in ['v', 'V', "\<C-V>"]
       for exclusive in [v:false, v:true]
         call assert_equal(range(10)->mapnew('string(v:val)'),
-              \ getregion([g:buf, 1, 1, 0], [g:buf, 10, 2, 0]),
-              \ {'type': type, 'exclusive': exclusive })
+              \ getregion([g:buf, 1, 1, 0], [g:buf, 10, 2, 0],
+              \ {'type': type, 'exclusive': exclusive }))
         call assert_equal(range(10)->mapnew('string(v:val)'),
-              \ getregion([g:buf, 10, 2, 0], [g:buf, 1, 1, 0]),
-              \ {'type': type, 'exclusive': exclusive })
+              \ getregion([g:buf, 10, 2, 0], [g:buf, 1, 1, 0],
+              \ {'type': type, 'exclusive': exclusive }))
       endfor
     endfor
 
diff --git a/src/version.c b/src/version.c
index e1b13bd..8f06552 100644
--- a/src/version.c
+++ b/src/version.c
@@ -705,6 +705,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    166,
+/**/
     165,
 /**/
     164,