# HG changeset patch # User Bram Moolenaar # Date 1645103704 -3600 # Node ID 3196066c5795b12b37d446011d5c9685237b073d # Parent a5c8bf8758c71718ac462e07deb0e6fb9f706eed patch 8.2.4407: Vim9: some code not covered by tests Commit: https://github.com/vim/vim/commit/e08be09a08485e8c919f46c05223c1ccfdaf175d Author: Bram Moolenaar Date: Thu Feb 17 13:08:26 2022 +0000 patch 8.2.4407: Vim9: some code not covered by tests Problem: Vim9: some code not covered by tests. Solution: Add more tests. Avoid giving two errors. Remove dead code. diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -543,6 +543,13 @@ def Test_assign_index() 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,6 +598,18 @@ def Test_assign_index() dl.one = {} END v9.CheckDefFailure(lines, 'E1012: Type mismatch; expected list but got dict', 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,6 +1220,21 @@ def Test_assignment_default() assert_equal(5678, nr) enddef +def Test_script_var_default() + var lines =<< trim END + vim9script + var l: list + var bl: blob + var d: dict + 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,6 +2116,25 @@ def Test_unlet() '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', diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim --- a/src/testdir/test_vim9_cmd.vim +++ b/src/testdir/test_vim9_cmd.vim @@ -1529,6 +1529,17 @@ def Test_lockvar() 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 diff --git a/src/testdir/test_vim9_func.vim b/src/testdir/test_vim9_func.vim --- a/src/testdir/test_vim9_func.vim +++ b/src/testdir/test_vim9_func.vim @@ -910,6 +910,14 @@ def Test_nested_def_list() 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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4407, +/**/ 4406, /**/ 4405, diff --git a/src/vim9execute.c b/src/vim9execute.c --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1750,122 +1750,118 @@ execute_storeindex(isn_T *iptr, ectx_T * status = FAIL; } } - else if (dest_type != tv_dest->v_type) + + if (status == OK) { - // 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) + if (dest_type == VAR_LIST) { - emsg(_(e_list_not_set)); - return FAIL; + 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); + } } - 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) + else if (dest_type == VAR_DICT) { - semsg(_(e_list_index_out_of_range_nr), lidx); - return FAIL; + 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); + } } - if (lidx < list->lv_len) + else if (dest_type == VAR_BLOB) { - listitem_T *li = list_find(list, lidx); - - if (error_if_locked(li->li_tv.v_lock, - e_cannot_change_locked_list_item)) + 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; - // overwrite existing list item - clear_tv(&li->li_tv); - li->li_tv = *tv; + } + 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 { - 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; + status = FAIL; + semsg(_(e_cannot_index_str), vartype_name(dest_type)); } - 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);