Patch 8.2.4407
Problem:    Vim9: some code not covered by tests.
Solution:   Add more tests.  Avoid giving two errors.  Remove dead code.
Files:      src/vim9execute.c, src/testdir/test_vim9_assign.vim,
            src/testdir/test_vim9_cmd.vim, src/testdir/test_vim9_func.vim


*** ../vim-8.2.4406/src/vim9execute.c   2022-02-16 21:48:20.962418942 +0000
--- src/vim9execute.c   2022-02-17 12:27:59.799406402 +0000
***************
*** 1750,1871 ****
            status = FAIL;
        }
      }
-     else if (dest_type != tv_dest->v_type)
-     {
-       // just in case, should be OK
-       semsg(_(e_expected_str_but_got_str),
-                   vartype_name(dest_type),
-                   vartype_name(tv_dest->v_type));
-       status = FAIL;
-     }
  
!     if (status == OK && dest_type == VAR_LIST)
      {
!       long        lidx = (long)tv_idx->vval.v_number;
!       list_T      *list = tv_dest->vval.v_list;
! 
!       if (list == NULL)
!       {
!           emsg(_(e_list_not_set));
!           return FAIL;
!       }
!       if (lidx < 0 && list->lv_len + lidx >= 0)
!           // negative index is relative to the end
!           lidx = list->lv_len + lidx;
!       if (lidx < 0 || lidx > list->lv_len)
        {
!           semsg(_(e_list_index_out_of_range_nr), lidx);
!           return FAIL;
!       }
!       if (lidx < list->lv_len)
!       {
!           listitem_T *li = list_find(list, lidx);
  
!           if (error_if_locked(li->li_tv.v_lock,
!                                            e_cannot_change_locked_list_item))
                return FAIL;
!           // overwrite existing list item
!           clear_tv(&li->li_tv);
!           li->li_tv = *tv;
!       }
!       else
!       {
!           if (error_if_locked(list->lv_lock, e_cannot_change_locked_list))
                return FAIL;
!           // append to list, only fails when out of memory
!           if (list_append_tv(list, tv) == FAIL)
!               return NOTDONE;
!           clear_tv(tv);
!       }
!     }
!     else if (status == OK && dest_type == VAR_DICT)
!     {
!       char_u          *key = tv_idx->vval.v_string;
!       dict_T          *dict = tv_dest->vval.v_dict;
!       dictitem_T      *di;
  
!       SOURCING_LNUM = iptr->isn_lnum;
!       if (dict == NULL)
!       {
!           emsg(_(e_dictionary_not_set));
!           return FAIL;
!       }
!       if (key == NULL)
!           key = (char_u *)"";
!       di = dict_find(dict, key, -1);
!       if (di != NULL)
!       {
!           if (error_if_locked(di->di_tv.v_lock, e_cannot_change_dict_item))
                return FAIL;
!           // overwrite existing value
!           clear_tv(&di->di_tv);
!           di->di_tv = *tv;
!       }
!       else
!       {
!           if (error_if_locked(dict->dv_lock, e_cannot_change_dict))
                return FAIL;
!           // add to dict, only fails when out of memory
!           if (dict_add_tv(dict, (char *)key, tv) == FAIL)
!               return NOTDONE;
!           clear_tv(tv);
!       }
!     }
!     else if (status == OK && dest_type == VAR_BLOB)
!     {
!       long        lidx = (long)tv_idx->vval.v_number;
!       blob_T      *blob = tv_dest->vval.v_blob;
!       varnumber_T nr;
!       int         error = FALSE;
!       int         len;
! 
!       if (blob == NULL)
!       {
!           emsg(_(e_blob_not_set));
!           return FAIL;
        }
!       len = blob_len(blob);
!       if (lidx < 0 && len + lidx >= 0)
!           // negative index is relative to the end
!           lidx = len + lidx;
! 
!       // Can add one byte at the end.
!       if (lidx < 0 || lidx > len)
        {
!           semsg(_(e_blob_index_out_of_range_nr), lidx);
!           return FAIL;
        }
-       if (value_check_lock(blob->bv_lock, (char_u *)"blob", FALSE))
-           return FAIL;
-       nr = tv_get_number_chk(tv, &error);
-       if (error)
-           return FAIL;
-       blob_set_append(blob, lidx, nr);
-     }
-     else
-     {
-       status = FAIL;
-       semsg(_(e_cannot_index_str), vartype_name(dest_type));
      }
  
      clear_tv(tv_idx);
--- 1750,1867 ----
            status = FAIL;
        }
      }
  
!     if (status == OK)
      {
!       if (dest_type == VAR_LIST)
        {
!           long            lidx = (long)tv_idx->vval.v_number;
!           list_T          *list = tv_dest->vval.v_list;
  
!           if (list == NULL)
!           {
!               emsg(_(e_list_not_set));
                return FAIL;
!           }
!           if (lidx < 0 && list->lv_len + lidx >= 0)
!               // negative index is relative to the end
!               lidx = list->lv_len + lidx;
!           if (lidx < 0 || lidx > list->lv_len)
!           {
!               semsg(_(e_list_index_out_of_range_nr), lidx);
                return FAIL;
!           }
!           if (lidx < list->lv_len)
!           {
!               listitem_T *li = list_find(list, lidx);
  
!               if (error_if_locked(li->li_tv.v_lock,
!                                            e_cannot_change_locked_list_item))
!                   return FAIL;
!               // overwrite existing list item
!               clear_tv(&li->li_tv);
!               li->li_tv = *tv;
!           }
!           else
!           {
!               if (error_if_locked(list->lv_lock, e_cannot_change_locked_list))
!                   return FAIL;
!               // append to list, only fails when out of memory
!               if (list_append_tv(list, tv) == FAIL)
!                   return NOTDONE;
!               clear_tv(tv);
!           }
!       }
!       else if (dest_type == VAR_DICT)
!       {
!           char_u              *key = tv_idx->vval.v_string;
!           dict_T              *dict = tv_dest->vval.v_dict;
!           dictitem_T  *di;
! 
!           SOURCING_LNUM = iptr->isn_lnum;
!           if (dict == NULL)
!           {
!               emsg(_(e_dictionary_not_set));
                return FAIL;
!           }
!           if (key == NULL)
!               key = (char_u *)"";
!           di = dict_find(dict, key, -1);
!           if (di != NULL)
!           {
!               if (error_if_locked(di->di_tv.v_lock,
!                                                   e_cannot_change_dict_item))
!                   return FAIL;
!               // overwrite existing value
!               clear_tv(&di->di_tv);
!               di->di_tv = *tv;
!           }
!           else
!           {
!               if (error_if_locked(dict->dv_lock, e_cannot_change_dict))
!                   return FAIL;
!               // add to dict, only fails when out of memory
!               if (dict_add_tv(dict, (char *)key, tv) == FAIL)
!                   return NOTDONE;
!               clear_tv(tv);
!           }
!       }
!       else if (dest_type == VAR_BLOB)
!       {
!           long            lidx = (long)tv_idx->vval.v_number;
!           blob_T          *blob = tv_dest->vval.v_blob;
!           varnumber_T nr;
!           int     error = FALSE;
!           int     len;
! 
!           if (blob == NULL)
!           {
!               emsg(_(e_blob_not_set));
                return FAIL;
!           }
!           len = blob_len(blob);
!           if (lidx < 0 && len + lidx >= 0)
!               // negative index is relative to the end
!               lidx = len + lidx;
! 
!           // Can add one byte at the end.
!           if (lidx < 0 || lidx > len)
!           {
!               semsg(_(e_blob_index_out_of_range_nr), lidx);
!               return FAIL;
!           }
!           if (value_check_lock(blob->bv_lock, (char_u *)"blob", FALSE))
!               return FAIL;
!           nr = tv_get_number_chk(tv, &error);
!           if (error)
!               return FAIL;
!           blob_set_append(blob, lidx, nr);
        }
!       else
        {
!           status = FAIL;
!           semsg(_(e_cannot_index_str), vartype_name(dest_type));
        }
      }
  
      clear_tv(tv_idx);
*** ../vim-8.2.4406/src/testdir/test_vim9_assign.vim    2022-02-15 
21:17:53.148747988 +0000
--- src/testdir/test_vim9_assign.vim    2022-02-17 12:55:44.504029188 +0000
***************
*** 543,548 ****
--- 543,555 ----
    d3.one.two.three = 123
    assert_equal({one: {two: {three: 123}}}, d3)
  
+   # blob
+   var bl: blob = 0z11223344
+   bl[0] = 0x77
+   assert_equal(0z77223344, bl)
+   bl[-2] = 0x66
+   assert_equal(0z77226644, bl)
+ 
    # should not read the next line when generating "a.b"
    var a = {}
    a.b = {}
***************
*** 591,596 ****
--- 598,615 ----
        dl.one = {}
    END
    v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected list<number> but 
got dict<unknown>', 2)
+ 
+   lines =<< trim END
+       g:l = [1, 2]
+       g:l['x'] = 3
+   END
+   v9.CheckDefExecAndScriptFailure(lines, ['E39:', 'E1030:'], 2)
+ 
+   lines =<< trim END
+     var bl: blob = test_null_blob()
+     bl[1] = 8
+   END
+   v9.CheckDefExecAndScriptFailure(lines, ['E1184:', 'E979:'], 2)
  enddef
  
  def Test_init_in_for_loop()
***************
*** 1201,1206 ****
--- 1220,1240 ----
    assert_equal(5678, nr)
  enddef
  
+ def Test_script_var_default()
+   var lines =<< trim END
+       vim9script
+       var l: list<number>
+       var bl: blob
+       var d: dict<number>
+       def Echo()
+         assert_equal([], l)
+         assert_equal(0z, bl)
+         assert_equal({}, d)
+       enddef
+   END
+   v9.CheckScriptSuccess(lines)
+ enddef
+ 
  let s:scriptvar = 'init'
  
  def Test_assignment_var_list()
***************
*** 2082,2087 ****
--- 2116,2140 ----
      'var ll = [1, 2]',
      'unlet ll[0: 1]',
      ], 'E1004:', 2)
+ 
+   v9.CheckDefExecFailure([
+     'g:ll = [1, 2]',
+     'g:idx = "x"',
+     'unlet g:ll[g:idx]',
+     ], 'E1029: Expected number but got string', 3)
+ 
+   v9.CheckDefExecFailure([
+     'g:ll = [1, 2, 3]',
+     'g:idx = "x"',
+     'unlet g:ll[g:idx : 2]',
+     ], 'E1029: Expected number but got string', 3)
+ 
+   v9.CheckDefExecFailure([
+     'g:ll = [1, 2, 3]',
+     'g:idx = "x"',
+     'unlet g:ll[0 : g:idx]',
+     ], 'E1029: Expected number but got string', 3)
+ 
    # command recognized as assignment when skipping, should not give an error
    v9.CheckScriptSuccess([
      'vim9script',
*** ../vim-8.2.4406/src/testdir/test_vim9_cmd.vim       2022-02-15 
21:17:53.148747988 +0000
--- src/testdir/test_vim9_cmd.vim       2022-02-17 12:59:29.795804440 +0000
***************
*** 1529,1534 ****
--- 1529,1545 ----
  
    var lines =<< trim END
        vim9script
+       g:bl = 0z1122
+       lockvar g:bl
+       def Tryit()
+         g:bl[1] = 99
+       enddef
+       Tryit()
+   END
+   v9.CheckScriptFailure(lines, 'E741:', 1)
+ 
+   lines =<< trim END
+       vim9script
        var theList = [1, 2, 3]
        def SetList()
          theList[1] = 22
*** ../vim-8.2.4406/src/testdir/test_vim9_func.vim      2022-02-16 
21:48:20.962418942 +0000
--- src/testdir/test_vim9_func.vim      2022-02-17 12:16:05.776907971 +0000
***************
*** 910,915 ****
--- 910,923 ----
    v9.CheckScriptFailure(lines, 'E476:', 1)
  enddef
  
+ def Test_global_function_not_found()
+   var lines =<< trim END
+       g:Ref = 123
+       call g:Ref()
+   END
+   v9.CheckDefExecAndScriptFailure(lines, ['E117:', 'E1085:'], 2)
+ enddef
+ 
  def Test_global_local_function()
    var lines =<< trim END
        vim9script
*** ../vim-8.2.4406/src/version.c       2022-02-17 11:26:38.721059013 +0000
--- src/version.c       2022-02-17 11:52:47.134764644 +0000
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     4407,
  /**/

-- 
Over the years, I've developed my sense of deja vu so acutely that now
I can remember things that *have* happened before ...

 /// Bram Moolenaar -- b...@moolenaar.net -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to vim_dev+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20220217130920.C63E61C0FE0%40moolenaar.net.

Raspunde prin e-mail lui