&& lp->ll_tv == &v->di_tv
&& ht != NULL && ht == get_script_local_ht())
{
- svar_T *sv = find_typval_in_script(lp->ll_tv, 0);
+ svar_T *sv = find_typval_in_script(lp->ll_tv, 0, TRUE);
// Vim9 script local variable: get the type
if (sv != NULL)
lp->ll_name);
ret = FAIL;
}
- else if ((di->di_flags & DI_FLAGS_FIX)
- && di->di_tv.v_type != VAR_DICT
- && di->di_tv.v_type != VAR_LIST)
- {
- // For historic reasons this error is not given for a list or
- // dict. E.g., the b: dict could be locked/unlocked.
- semsg(_(e_cannot_lock_or_unlock_variable_str), lp->ll_name);
- ret = FAIL;
- }
else
{
- if (lock)
- di->di_flags |= DI_FLAGS_LOCK;
+ if ((di->di_flags & DI_FLAGS_FIX)
+ && di->di_tv.v_type != VAR_DICT
+ && di->di_tv.v_type != VAR_LIST)
+ {
+ // For historic reasons this error is not given for a list
+ // or dict. E.g., the b: dict could be locked/unlocked.
+ semsg(_(e_cannot_lock_or_unlock_variable_str), lp->ll_name);
+ ret = FAIL;
+ }
else
- di->di_flags &= ~DI_FLAGS_LOCK;
- if (deep != 0)
- item_lock(&di->di_tv, deep, lock, FALSE);
+ {
+ if (in_vim9script())
+ {
+ svar_T *sv = find_typval_in_script(&di->di_tv,
+ 0, FALSE);
+
+ if (sv != NULL && sv->sv_const != 0)
+ {
+ semsg(_(e_cannot_change_readonly_variable_str),
+ lp->ll_name);
+ ret = FAIL;
+ }
+ }
+
+ if (ret == OK)
+ {
+ if (lock)
+ di->di_flags |= DI_FLAGS_LOCK;
+ else
+ di->di_flags &= ~DI_FLAGS_LOCK;
+ if (deep != 0)
+ item_lock(&di->di_tv, deep, lock, FALSE);
+ }
+ }
}
}
*name_end = cc;
if (ht != NULL && ht == get_script_local_ht()
&& tv != &SCRIPT_SV(current_sctx.sc_sid)->sv_var.di_tv)
{
- svar_T *sv = find_typval_in_script(tv, 0);
+ svar_T *sv = find_typval_in_script(tv, 0, TRUE);
if (sv != NULL)
type = sv->sv_type;
if (var_in_vim9script && (flags & ASSIGN_FOR_LOOP) == 0)
{
where_T where = WHERE_INIT;
- svar_T *sv = find_typval_in_script(&di->di_tv, sid);
+ svar_T *sv = find_typval_in_script(&di->di_tv, sid, TRUE);
if (sv != NULL)
{
# define ex_throw ex_ni
# define ex_try ex_ni
# define ex_unlet ex_ni
-# define ex_unlockvar ex_ni
# define ex_while ex_ni
# define ex_import ex_ni
# define ex_export ex_ni
char_u *vim9_declare_scriptvar(exarg_T *eap, char_u *arg);
void update_vim9_script_var(int create, dictitem_T *di, char_u *name, int flags, typval_T *tv, type_T **type, int do_member);
void hide_script_var(scriptitem_T *si, int idx, int func_defined);
-svar_T *find_typval_in_script(typval_T *dest, scid_T sid);
+svar_T *find_typval_in_script(typval_T *dest, scid_T sid, int must_find);
int check_script_var_type(svar_T *sv, typval_T *value, char_u *name, where_T where);
int check_reserved_name(char_u *name);
/* vim: set ft=c : */
LockIt()
END
v9.CheckScriptFailure(lines, 'E1246', 1)
+
+ lines =<< trim END
+ vim9script
+ const name = 'john'
+ unlockvar name
+ END
+ v9.CheckScriptFailure(lines, 'E46', 3)
+
+ lines =<< trim END
+ vim9script
+ const name = 'john'
+ def UnLockIt()
+ unlockvar name
+ enddef
+ UnLockIt()
+ END
+ v9.CheckScriptFailure(lines, 'E46', 1)
enddef
def Test_substitute_expr()
{
if (!did_type && type != NULL && ht == get_script_local_ht())
{
- svar_T *sv = find_typval_in_script(tv, 0);
+ svar_T *sv = find_typval_in_script(tv, 0, TRUE);
if (sv != NULL)
*type = sv->sv_type;
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 4682,
/**/
4681,
/**/
}
else
{
- sv = find_typval_in_script(&di->di_tv, 0);
+ sv = find_typval_in_script(&di->di_tv, 0, TRUE);
}
if (sv != NULL)
{
/*
* Find the script-local variable that links to "dest".
* If "sid" is zero use the current script.
+ * if "must_find" is TRUE and "dest" cannot be found report an internal error.
* Returns NULL if not found and give an internal error.
*/
svar_T *
-find_typval_in_script(typval_T *dest, scid_T sid)
+find_typval_in_script(typval_T *dest, scid_T sid, int must_find)
{
scriptitem_T *si = SCRIPT_ITEM(sid == 0 ? current_sctx.sc_sid : sid);
int idx;
if (sv->sv_name != NULL && sv->sv_tv == dest)
return sv;
}
- iemsg("find_typval_in_script(): not found");
+ if (must_find)
+ iemsg("find_typval_in_script(): not found");
return NULL;
}