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]
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
{
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