diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-02-17 14:42:02 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-02-17 14:42:02 +0000 |
commit | ea5c898b5fb60828b0223f258910f84f5c645e63 (patch) | |
tree | d8df35556cad1d7b84116c33a3dafa8bb521a560 | |
parent | e08be09a08485e8c919f46c05223c1ccfdaf175d (diff) | |
download | vim-git-ea5c898b5fb60828b0223f258910f84f5c645e63.tar.gz |
patch 8.2.4408: Vim9: some code not covered by testsv8.2.4408
Problem: Vim9: some code not covered by tests.
Solution: Add a few more tests. Correct error message. Allow unlet on dict
with a number key.
-rw-r--r-- | src/errors.h | 3 | ||||
-rw-r--r-- | src/testdir/test_vim9_assign.vim | 15 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9execute.c | 24 |
4 files changed, 33 insertions, 11 deletions
diff --git a/src/errors.h b/src/errors.h index 8e2b9da6c..5f2685ab3 100644 --- a/src/errors.h +++ b/src/errors.h @@ -3010,8 +3010,7 @@ EXTERN char e_variable_arguments_type_must_be_list_str[] INIT(= N_("E1180: Variable arguments type must be a list: %s")); EXTERN char e_cannot_use_underscore_here[] INIT(= N_("E1181: Cannot use an underscore here")); -EXTERN char e_blob_required[] - INIT(= N_("E1182: Blob required")); +// E1182 unused EXTERN char e_cannot_use_range_with_assignment_operator_str[] INIT(= N_("E1183: Cannot use a range with an assignment operator: %s")); #endif diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index 835bc1edd..c5f56c2ef 100644 --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -610,6 +610,12 @@ def Test_assign_index() bl[1] = 8 END v9.CheckDefExecAndScriptFailure(lines, ['E1184:', 'E979:'], 2) + + lines =<< trim END + g:bl = 'not a blob' + g:bl[1 : 2] = 8 + END + v9.CheckDefExecAndScriptFailure(lines, ['E897:', 'E689:'], 2) enddef def Test_init_in_for_loop() @@ -1231,6 +1237,7 @@ def Test_script_var_default() assert_equal(0z, bl) assert_equal({}, d) enddef + Echo() END v9.CheckScriptSuccess(lines) enddef @@ -2070,9 +2077,10 @@ def Test_unlet() ], 'E1081:', 2) # dict unlet - var dd = {a: 1, b: 2, c: 3} + var dd = {a: 1, b: 2, c: 3, 4: 4} unlet dd['a'] unlet dd.c + unlet dd[4] assert_equal({b: 2}, dd) # list unlet @@ -2181,6 +2189,11 @@ def Test_unlet() 'unlet dd[g:alist]', ], 'E1105:', 2) + v9.CheckDefExecFailure([ + 'g:dd = {"a": 1, 2: 2}' + 'unlet g:dd[0z11]', + ], 'E1029:', 2) + # can compile unlet before variable exists g:someDict = {key: 'val'} var k = 'key' diff --git a/src/version.c b/src/version.c index 76d7895e0..edac69059 100644 --- 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 */ /**/ + 4408, +/**/ 4407, /**/ 4406, diff --git a/src/vim9execute.c b/src/vim9execute.c index 318fec918..1c5dd74da 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -1876,7 +1876,7 @@ execute_storeindex(isn_T *iptr, ectx_T *ectx) } /* - * Store a value in a blob range. + * Store a value in a list or blob range. */ static int execute_storerange(isn_T *iptr, ectx_T *ectx) @@ -1893,13 +1893,13 @@ execute_storerange(isn_T *iptr, ectx_T *ectx) // -2 second index or "none" // -1 destination list or blob tv = STACK_TV_BOT(-4); + SOURCING_LNUM = iptr->isn_lnum; if (tv_dest->v_type == VAR_LIST) { long n1; long n2; int error = FALSE; - SOURCING_LNUM = iptr->isn_lnum; n1 = (long)tv_get_number_chk(tv_idx1, &error); if (error) status = FAIL; @@ -1973,7 +1973,7 @@ execute_storerange(isn_T *iptr, ectx_T *ectx) else { status = FAIL; - emsg(_(e_blob_required)); + emsg(_(e_list_or_blob_required)); } clear_tv(tv_idx1); @@ -2001,7 +2001,7 @@ execute_unletindex(isn_T *iptr, ectx_T *ectx) if (tv_dest->v_type == VAR_DICT) { // unlet a dict item, index must be a string - if (tv_idx->v_type != VAR_STRING) + if (tv_idx->v_type != VAR_STRING && tv_idx->v_type != VAR_NUMBER) { SOURCING_LNUM = iptr->isn_lnum; semsg(_(e_expected_str_but_got_str), @@ -2012,7 +2012,7 @@ execute_unletindex(isn_T *iptr, ectx_T *ectx) else { dict_T *d = tv_dest->vval.v_dict; - char_u *key = tv_idx->vval.v_string; + char_u *key; dictitem_T *di = NULL; if (d != NULL && value_check_lock( @@ -2021,8 +2021,16 @@ execute_unletindex(isn_T *iptr, ectx_T *ectx) else { SOURCING_LNUM = iptr->isn_lnum; - if (key == NULL) - key = (char_u *)""; + if (tv_idx->v_type == VAR_STRING) + { + key = tv_idx->vval.v_string; + if (key == NULL) + key = (char_u *)""; + } + else + { + key = tv_get_string(tv_idx); + } if (d != NULL) di = dict_find(d, key, (int)STRLEN(key)); if (di == NULL) @@ -3173,7 +3181,7 @@ exec_instructions(ectx_T *ectx) } break; - // store value in blob range + // store value in list or blob range case ISN_STORERANGE: if (execute_storerange(iptr, ectx) == FAIL) goto on_error; |