To: vim_dev@googlegroups.com Subject: Patch 8.2.4600 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4600 Problem: Vim9: not enough test coverage for executing :def function. Solution: Add a few more tests. Fix inconsistencies. Files: src/vim9execute.c, src/evalvars.c, src/proto/evalvars.pro, src/testdir/test_listdict.vim, src/testdir/test_vim9_assign.vim, src/testdir/test_vim9_cmd.vim *** ../vim-8.2.4599/src/vim9execute.c 2022-03-18 21:41:43.816964266 +0000 --- src/vim9execute.c 2022-03-20 17:38:28.351574079 +0000 *************** *** 2048,2056 **** semsg(_(e_list_index_out_of_range_nr), n); status = FAIL; } - else if (value_check_lock(li->li_tv.v_lock, - NULL, FALSE)) - status = FAIL; else listitem_remove(l, li); } --- 2048,2053 ---- *************** *** 2133,2143 **** semsg(_(e_list_index_out_of_range_nr), n2); status = FAIL; } ! if (status != FAIL ! && list_unlet_range(l, li, NULL, n1, ! tv_idx2->v_type != VAR_SPECIAL, n2) ! == FAIL) ! status = FAIL; } } } --- 2130,2138 ---- semsg(_(e_list_index_out_of_range_nr), n2); status = FAIL; } ! if (status != FAIL) ! list_unlet_range(l, li, n1, ! tv_idx2->v_type != VAR_SPECIAL, n2); } } } *** ../vim-8.2.4599/src/evalvars.c 2022-03-08 13:18:10.813020777 +0000 --- src/evalvars.c 2022-03-20 17:37:52.151365845 +0000 *************** *** 1804,1823 **** && value_check_lock(lp->ll_dict->dv_lock, lp->ll_name, FALSE))) return FAIL; else if (lp->ll_range) ! { ! if (list_unlet_range(lp->ll_list, lp->ll_li, lp->ll_name, lp->ll_n1, ! !lp->ll_empty2, lp->ll_n2) == FAIL) ! return FAIL; ! } else ! { ! if (lp->ll_list != NULL) ! // unlet a List item. ! listitem_remove(lp->ll_list, lp->ll_li); ! else ! // unlet a Dictionary item. ! dictitem_remove(lp->ll_dict, lp->ll_di); ! } return ret; } --- 1804,1817 ---- && value_check_lock(lp->ll_dict->dv_lock, lp->ll_name, FALSE))) return FAIL; else if (lp->ll_range) ! list_unlet_range(lp->ll_list, lp->ll_li, lp->ll_n1, ! !lp->ll_empty2, lp->ll_n2); ! else if (lp->ll_list != NULL) ! // unlet a List item. ! listitem_remove(lp->ll_list, lp->ll_li); else ! // unlet a Dictionary item. ! dictitem_remove(lp->ll_dict, lp->ll_di); return ret; } *************** *** 1826,1836 **** * Unlet one item or a range of items from a list. * Return OK or FAIL. */ ! int list_unlet_range( list_T *l, listitem_T *li_first, - char_u *name, long n1_arg, int has_n2, long n2) --- 1820,1829 ---- * Unlet one item or a range of items from a list. * Return OK or FAIL. */ ! void list_unlet_range( list_T *l, listitem_T *li_first, long n1_arg, int has_n2, long n2) *************** *** 1838,1851 **** listitem_T *li = li_first; int n1 = n1_arg; - while (li != NULL && (!has_n2 || n2 >= n1)) - { - if (value_check_lock(li->li_tv.v_lock, name, FALSE)) - return FAIL; - li = li->li_next; - ++n1; - } - // Delete a range of List items. li = li_first; n1 = n1_arg; --- 1831,1836 ---- *************** *** 1857,1863 **** li = next; ++n1; } - return OK; } /* * "unlet" a variable. Return OK if it existed, FAIL if not. --- 1842,1847 ---- *** ../vim-8.2.4599/src/proto/evalvars.pro 2022-01-21 13:29:52.479888865 +0000 --- src/proto/evalvars.pro 2022-03-20 17:38:34.459607504 +0000 *************** *** 23,29 **** void ex_unlet(exarg_T *eap); void ex_lockvar(exarg_T *eap); void ex_unletlock(exarg_T *eap, char_u *argstart, int deep, int glv_flags, int (*callback)(lval_T *, char_u *, exarg_T *, int, void *), void *cookie); ! int list_unlet_range(list_T *l, listitem_T *li_first, char_u *name, long n1_arg, int has_n2, long n2); int do_unlet(char_u *name, int forceit); void item_lock(typval_T *tv, int deep, int lock, int check_refcount); void del_menutrans_vars(void); --- 23,29 ---- void ex_unlet(exarg_T *eap); void ex_lockvar(exarg_T *eap); void ex_unletlock(exarg_T *eap, char_u *argstart, int deep, int glv_flags, int (*callback)(lval_T *, char_u *, exarg_T *, int, void *), void *cookie); ! void list_unlet_range(list_T *l, listitem_T *li_first, long n1_arg, int has_n2, long n2); int do_unlet(char_u *name, int forceit); void item_lock(typval_T *tv, int deep, int lock, int check_refcount); void del_menutrans_vars(void); *** ../vim-8.2.4599/src/testdir/test_listdict.vim 2022-02-23 13:16:55.761541147 +0000 --- src/testdir/test_listdict.vim 2022-03-20 17:35:54.930558414 +0000 *************** *** 721,730 **** endfor endfor ! " Deleting a list range should fail if the range is locked let l = [1, 2, 3, 4] lockvar l[1:2] ! call assert_fails('unlet l[1:2]', 'E741:') unlet l endfunc --- 721,733 ---- endfor endfor ! " Deleting a list range with locked items works, but changing the items ! " fails. let l = [1, 2, 3, 4] lockvar l[1:2] ! call assert_fails('let l[1:2] = [8, 9]', 'E741:') ! unlet l[1:2] ! call assert_equal([1, 4], l) unlet l endfunc *** ../vim-8.2.4599/src/testdir/test_vim9_assign.vim 2022-03-18 21:41:43.816964266 +0000 --- src/testdir/test_vim9_assign.vim 2022-03-20 16:54:05.230420923 +0000 *************** *** 2209,2214 **** --- 2209,2219 ---- unlet dd[4] assert_equal({b: 2}, dd) + # null key works like empty string + dd = {'': 1, x: 9} + unlet dd[null_string] + assert_equal({x: 9}, dd) + # list unlet var ll = [1, 2, 3, 4] unlet ll[1] *** ../vim-8.2.4599/src/testdir/test_vim9_cmd.vim 2022-03-12 14:51:12.765797435 +0000 --- src/testdir/test_vim9_cmd.vim 2022-03-20 17:23:17.763088228 +0000 *************** *** 1573,1578 **** --- 1573,1608 ---- END v9.CheckScriptFailure(lines, 'E741', 2) + # can unlet a locked list item but not change it + lines =<< trim END + var ll = [1, 2, 3] + lockvar ll[1] + unlet ll[1] + assert_equal([1, 3], ll) + END + v9.CheckDefAndScriptSuccess(lines) + lines =<< trim END + var ll = [1, 2, 3] + lockvar ll[1] + ll[1] = 9 + END + v9.CheckDefExecAndScriptFailure(lines, ['E1119:', 'E741'], 3) + + # can unlet a locked dict item but not change it + lines =<< trim END + var dd = {a: 1, b: 2} + lockvar dd.a + unlet dd.a + assert_equal({b: 2}, dd) + END + v9.CheckDefAndScriptSuccess(lines) + lines =<< trim END + var dd = {a: 1, b: 2} + lockvar dd.a + dd.a = 3 + END + v9.CheckDefExecAndScriptFailure(lines, ['E1121:', 'E741'], 3) + lines =<< trim END var theList = [1, 2, 3] lockvar theList *** ../vim-8.2.4599/src/version.c 2022-03-20 15:42:57.533626860 +0000 --- src/version.c 2022-03-20 16:55:02.030208718 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4600, /**/ -- Just think of all the things we haven't thought of yet. /// 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 ///