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:
@@ -719,6 +719,7 @@ func Test_list_locked_var_unlet()
|
||||
call assert_equal(expected[depth][u][1], ps)
|
||||
endfor
|
||||
endfor
|
||||
|
||||
" Deleting a list range should fail if the range is locked
|
||||
let l = [1, 2, 3, 4]
|
||||
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_equal([1, 2, 3, 4], 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
|
||||
|
||||
" Locking part of the list
|
||||
|
@@ -749,6 +749,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
3842,
|
||||
/**/
|
||||
3841,
|
||||
/**/
|
||||
|
@@ -2898,18 +2898,26 @@ exec_instructions(ectx_T *ectx)
|
||||
{
|
||||
list_T *l = tv_dest->vval.v_list;
|
||||
long n = (long)tv_idx->vval.v_number;
|
||||
listitem_T *li = NULL;
|
||||
|
||||
li = list_find(l, n);
|
||||
if (li == NULL)
|
||||
{
|
||||
SOURCING_LNUM = iptr->isn_lnum;
|
||||
semsg(_(e_listidx), n);
|
||||
if (l != NULL && value_check_lock(
|
||||
l->lv_lock, NULL, FALSE))
|
||||
status = FAIL;
|
||||
}
|
||||
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
|
||||
|
Reference in New Issue
Block a user