patch 8.2.3339: Vim9: cannot lock a member in a local dict
Problem: Vim9: cannot lock a member in a local dict.
Solution: Get the local dict from the stack and pass it to get_lval().
diff --git a/src/eval.c b/src/eval.c
index edef878..0dd2058 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -902,17 +902,26 @@
if ((*p != '[' && *p != '.') || lp->ll_name == NULL)
return p;
- cc = *p;
- *p = NUL;
- // When we would write to the variable pass &ht and prevent autoload.
- writing = !(flags & GLV_READ_ONLY);
- v = find_var(lp->ll_name, writing ? &ht : NULL,
+ if (in_vim9script() && lval_root != NULL)
+ {
+ // using local variable
+ lp->ll_tv = lval_root;
+ }
+ else
+ {
+ cc = *p;
+ *p = NUL;
+ // When we would write to the variable pass &ht and prevent autoload.
+ writing = !(flags & GLV_READ_ONLY);
+ v = find_var(lp->ll_name, writing ? &ht : NULL,
(flags & GLV_NO_AUTOLOAD) || writing);
- if (v == NULL && !quiet)
- semsg(_(e_undefined_variable_str), lp->ll_name);
- *p = cc;
- if (v == NULL)
- return NULL;
+ if (v == NULL && !quiet)
+ semsg(_(e_undefined_variable_str), lp->ll_name);
+ *p = cc;
+ if (v == NULL)
+ return NULL;
+ lp->ll_tv = &v->di_tv;
+ }
if (in_vim9script() && (flags & GLV_NO_DECL) == 0)
{
@@ -924,7 +933,6 @@
/*
* Loop until no more [idx] or .key is following.
*/
- lp->ll_tv = &v->di_tv;
var1.v_type = VAR_UNKNOWN;
var2.v_type = VAR_UNKNOWN;
while (*p == '[' || (*p == '.' && p[1] != '=' && p[1] != '.'))