0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.2.3842: Vim9: can change locked list and list items

Problem:    Vim9: can change locked list and list items.
Solution:   Check that a list and list item isn't locked.
This commit is contained in:
Bram Moolenaar
2021-12-17 20:36:15 +00:00
parent 71b7685092
commit 422085f1c8
3 changed files with 31 additions and 9 deletions

View File

@@ -719,6 +719,7 @@ func Test_list_locked_var_unlet()
call assert_equal(expected[depth][u][1], ps) call assert_equal(expected[depth][u][1], ps)
endfor endfor
endfor endfor
" Deleting a list range should fail if the range is locked " Deleting a list range should fail if the range is locked
let l = [1, 2, 3, 4] let l = [1, 2, 3, 4]
lockvar l[1:2] lockvar l[1:2]
@@ -848,6 +849,17 @@ func Test_let_lock_list()
call assert_fails('let l[1:2] = [0, 1]', 'E741:') call assert_fails('let l[1:2] = [0, 1]', 'E741:')
call assert_equal([1, 2, 3, 4], l) call assert_equal([1, 2, 3, 4], l)
unlet l unlet l
let lines =<< trim END
def TryUnletListItem(l: list<any>)
unlet l[0]
enddef
let l = [1, 2, 3, 4]
lockvar! l
call TryUnletListItem(l)
END
call CheckScriptFailure(lines, 'E741:')
unlet g:l
endfunc endfunc
" Locking part of the list " Locking part of the list

View File

@@ -749,6 +749,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3842,
/**/ /**/
3841, 3841,
/**/ /**/

View File

@@ -2898,18 +2898,26 @@ exec_instructions(ectx_T *ectx)
{ {
list_T *l = tv_dest->vval.v_list; list_T *l = tv_dest->vval.v_list;
long n = (long)tv_idx->vval.v_number; long n = (long)tv_idx->vval.v_number;
listitem_T *li = NULL;
li = list_find(l, n); if (l != NULL && value_check_lock(
if (li == NULL) l->lv_lock, NULL, FALSE))
{
SOURCING_LNUM = iptr->isn_lnum;
semsg(_(e_listidx), n);
status = FAIL; status = FAIL;
}
else else
// TODO: check for list or item locked {
listitem_remove(l, li); listitem_T *li = list_find(l, n);
if (li == NULL)
{
SOURCING_LNUM = iptr->isn_lnum;
semsg(_(e_listidx), n);
status = FAIL;
}
else if (value_check_lock(li->li_tv.v_lock,
NULL, FALSE))
status = FAIL;
else
listitem_remove(l, li);
}
} }
} }
else else