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 -- Br...@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 ///