summaryrefslogtreecommitdiffstats
path: root/src/evalvars.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-01-26 21:01:15 +0000
committerBram Moolenaar <Bram@vim.org>2022-01-26 21:01:15 +0000
commit70c43d84be98ab54d3723155dcc4232dc5a5f081 (patch)
tree31f3a580fe1bbfecc50e822e718696836d9cb95c /src/evalvars.c
parent1080c48ec8d672d7e9fbefb5a1255c9df09a2884 (diff)
patch 8.2.4225: Vim9: depth argument of :lockvar not parsed in :def functionv8.2.4225
Problem: Vim9: depth argument of :lockvar not parsed in :def function. Solution: Parse the optional depth argument. (closes #9629) Fix that locking doesn't work for a non-materialize list.
Diffstat (limited to 'src/evalvars.c')
-rw-r--r--src/evalvars.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index 496666e1ea..c53cc87fbc 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -2060,10 +2060,18 @@ item_lock(typval_T *tv, int deep, int lock, int check_refcount)
l->lv_lock |= VAR_LOCKED;
else
l->lv_lock &= ~VAR_LOCKED;
- if ((deep < 0 || deep > 1) && l->lv_first != &range_list_item)
- // recursive: lock/unlock the items the List contains
- FOR_ALL_LIST_ITEMS(l, li)
- item_lock(&li->li_tv, deep - 1, lock, check_refcount);
+ if (deep < 0 || deep > 1)
+ {
+ if (l->lv_first == &range_list_item)
+ l->lv_lock |= VAR_ITEMS_LOCKED;
+ else
+ {
+ // recursive: lock/unlock the items the List contains
+ CHECK_LIST_MATERIALIZE(l);
+ FOR_ALL_LIST_ITEMS(l, li) item_lock(&li->li_tv,
+ deep - 1, lock, check_refcount);
+ }
+ }
}
break;
case VAR_DICT: