To: vim_dev@googlegroups.com Subject: Patch 8.2.4407 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ 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 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,1206 **** --- 1220,1240 ---- 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,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 -- Bram@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 ///