patch 8.2.0600: Vim9: cannot read or write w:, t: and b: variables

Problem:    Vim9: cannot read or write w:, t: and b: variables.
Solution:   Implement load and store for w:, t: and b: variables.
            (closes #5950)
diff --git a/src/testdir/test_vim9_disassemble.vim b/src/testdir/test_vim9_disassemble.vim
index 985c8ca..13d9542 100644
--- a/src/testdir/test_vim9_disassemble.vim
+++ b/src/testdir/test_vim9_disassemble.vim
@@ -8,6 +8,9 @@
 
 let s:scriptvar = 4
 let g:globalvar = 'g'
+let b:buffervar = 'b'
+let w:windowvar = 'w'
+let t:tabpagevar = 't'
 
 def s:ScriptFuncLoad(arg: string)
   let local = 1
@@ -17,6 +20,9 @@
   echo v:version
   echo s:scriptvar
   echo g:globalvar
+  echo b:buffervar
+  echo w:windowvar
+  echo t:tabpagevar
   echo &tabstop
   echo $ENVVAR
   echo @z
@@ -39,6 +45,9 @@
         ' LOADV v:version.*' ..
         ' LOADS s:scriptvar from .*test_vim9_disassemble.vim.*' ..
         ' LOADG g:globalvar.*' ..
+        ' LOADB b:buffervar.*' ..
+        ' LOADW w:windowvar.*' ..
+        ' LOADT t:tabpagevar.*' ..
         ' LOADENV $ENVVAR.*' ..
         ' LOADREG @z.*',
         res)
@@ -79,6 +88,9 @@
   v:char = 'abc'
   s:scriptvar = 'sv'
   g:globalvar = 'gv'
+  b:buffervar = 'bv'
+  w:windowvar = 'wv'
+  t:tabpagevar = 'tv'
   &tabstop = 8
   $ENVVAR = 'ev'
   @z = 'rv'
@@ -99,6 +111,12 @@
         ' STORES s:scriptvar in .*test_vim9_disassemble.vim.*' ..
         'g:globalvar = ''gv''.*' ..
         ' STOREG g:globalvar.*' ..
+        'b:buffervar = ''bv''.*' ..
+        ' STOREB b:buffervar.*' ..
+        'w:windowvar = ''wv''.*' ..
+        ' STOREW w:windowvar.*' ..
+        't:tabpagevar = ''tv''.*' ..
+        ' STORET t:tabpagevar.*' ..
         '&tabstop = 8.*' ..
         ' STOREOPT &tabstop.*' ..
         '$ENVVAR = ''ev''.*' ..
diff --git a/src/testdir/test_vim9_expr.vim b/src/testdir/test_vim9_expr.vim
index dad4dee..fe3752c 100644
--- a/src/testdir/test_vim9_expr.vim
+++ b/src/testdir/test_vim9_expr.vim
@@ -931,11 +931,6 @@
   call CheckDefFailure("echo l:somevar", 'E1075:')
   call CheckDefFailure("echo x:somevar", 'E1075:')
 
-  " TODO
-  call CheckDefFailure("echo b:somevar", 'not supported yet')
-  call CheckDefFailure("echo w:somevar", 'not supported yet')
-  call CheckDefFailure("echo t:somevar", 'not supported yet')
-
   call CheckDefExecFailure("let x = +g:astring", 'E1030:')
   call CheckDefExecFailure("let x = +g:ablob", 'E974:')
   call CheckDefExecFailure("let x = +g:alist", 'E745:')
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 1963c2e..15ac0fc 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -135,6 +135,38 @@
   call CheckDefFailure(['v:errmsg += 123'], 'E1013:')
 enddef
 
+def Test_assignment_local()
+  " Test in a separated file in order not to the current buffer/window/tab is
+  " changed.
+  let script_lines: list<string> =<< trim END
+    let b:existing = 'yes'
+    let w:existing = 'yes'
+    let t:existing = 'yes'
+
+    def Test_assignment_local_internal()
+      b:newvar = 'new'
+      assert_equal('new', b:newvar)
+      assert_equal('yes', b:existing)
+      b:existing = 'no'
+      assert_equal('no', b:existing)
+
+      w:newvar = 'new'
+      assert_equal('new', w:newvar)
+      assert_equal('yes', w:existing)
+      w:existing = 'no'
+      assert_equal('no', w:existing)
+
+      t:newvar = 'new'
+      assert_equal('new', t:newvar)
+      assert_equal('yes', t:existing)
+      t:existing = 'no'
+      assert_equal('no', t:existing)
+    enddef
+    call Test_assignment_local_internal()
+  END
+  call CheckScriptSuccess(script_lines)
+enddef
+
 def Test_assignment_default()
 
   # Test default values.
@@ -201,11 +233,17 @@
   call CheckDefFailure(['let @a = 5'], 'E1066:')
 
   call CheckDefFailure(['let g:var = 5'], 'E1016:')
+  call CheckDefFailure(['let w:var = 5'], 'E1079:')
+  call CheckDefFailure(['let b:var = 5'], 'E1078:')
+  call CheckDefFailure(['let t:var = 5'], 'E1080:')
 
   call CheckDefFailure(['let anr = 4', 'anr ..= "text"'], 'E1019:')
   call CheckDefFailure(['let xnr += 4'], 'E1020:')
 
   call CheckScriptFailure(['vim9script', 'def Func()', 'let dummy = s:notfound', 'enddef'], 'E1050:')
+  " TODO: implement this error
+  "call CheckScriptFailure(['vim9script', 'let svar = 123', 'unlet svar'], 'E1050:')
+  "call CheckScriptFailure(['vim9script', 'let svar = 123', 'unlet s:svar'], 'E1050:')
 
   call CheckDefFailure(['let var: list<string> = [123]'], 'expected list<string> but got list<number>')
   call CheckDefFailure(['let var: list<number> = ["xx"]'], 'expected list<number> but got list<string>')