summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-02-19 22:31:48 +0100
committerBram Moolenaar <Bram@vim.org>2020-02-19 22:31:48 +0100
commit0bbf722aaaa75b1bbe87ef6afc44c5fff8e3893b (patch)
tree0be9aa036edeb0d00e5415850842901947369ef3
parentc0d656c89df4cf5a7d712dfb264853b9ca7d586f (diff)
patch 8.2.0285: unused error message; cannot create s:varv8.2.0285
Problem: Unused error message. Cannot create s:var. Solution: Remove the error message. Make assignment to s:var work.
-rw-r--r--src/testdir/test_vim9_script.vim2
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c9
-rw-r--r--src/vim9execute.c51
4 files changed, 35 insertions, 29 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 1fb08ab7e8..ac721a80c6 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -65,6 +65,8 @@ def Test_assignment()
assert_equal('xxxyyy', s:appendToMe)
s:addToMe += 222
assert_equal(333, s:addToMe)
+ s:newVar = 'new'
+ assert_equal('new', s:newVar)
enddef
func Test_assignment_failure()
diff --git a/src/version.c b/src/version.c
index c09d556d28..9dc3c6fa9d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -739,6 +739,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 285,
+/**/
284,
/**/
283,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 08cf0e6358..45dbf4337f 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3284,10 +3284,9 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
}
}
}
- else if ((STRNCMP(arg, "s:", 2) == 0
- ? lookup_script(arg + 2, varlen - 2)
- : lookup_script(arg, varlen)) == OK
- || find_imported(arg, varlen, cctx) != NULL)
+ else if (STRNCMP(arg, "s:", 2) == 0
+ || lookup_script(arg, varlen) == OK
+ || find_imported(arg, varlen, cctx) != NULL)
{
dest = dest_script;
if (is_decl)
@@ -3566,7 +3565,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
idx = get_script_item_idx(sid, rawname, TRUE);
// TODO: specific type
if (idx < 0)
- generate_OLDSCRIPT(cctx, ISN_STORES, rawname, sid, &t_any);
+ generate_OLDSCRIPT(cctx, ISN_STORES, name, sid, &t_any);
else
generate_VIM9SCRIPT(cctx, ISN_STORESCRIPT,
sid, idx, &t_any);
diff --git a/src/vim9execute.c b/src/vim9execute.c
index 399720aaf5..6fad391d1f 100644
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -356,6 +356,20 @@ call_partial(typval_T *tv, int argcount, ectx_T *ectx)
}
/*
+ * Store "tv" in variable "name".
+ * This is for s: and g: variables.
+ */
+ static void
+store_var(char_u *name, typval_T *tv)
+{
+ funccal_entry_T entry;
+
+ save_funccal(&entry);
+ set_var_const(name, NULL, tv, FALSE, 0);
+ restore_funccal();
+}
+
+/*
* Execute a function by "name".
* This can be a builtin function, user function or a funcref.
*/
@@ -556,6 +570,7 @@ call_def_function(
iptr->isn_arg.loadstore.ls_sid);
char_u *name = iptr->isn_arg.loadstore.ls_name;
dictitem_T *di = find_var_in_ht(ht, 0, name, TRUE);
+
if (di == NULL)
{
semsg(_(e_undefvar), name);
@@ -574,10 +589,9 @@ call_def_function(
// load g: variable
case ISN_LOADG:
{
- dictitem_T *di;
-
- di = find_var_in_ht(get_globvar_ht(), 0,
+ dictitem_T *di = find_var_in_ht(get_globvar_ht(), 0,
iptr->isn_arg.string, TRUE);
+
if (di == NULL)
{
semsg(_("E121: Undefined variable: g:%s"),
@@ -617,12 +631,8 @@ call_def_function(
if (ga_grow(&ectx.ec_stack, 1) == FAIL)
goto failed;
- if (get_env_tv(&name, &optval, TRUE) == FAIL)
- {
- semsg(_("E1060: Invalid environment variable name: %s"),
- iptr->isn_arg.string);
- goto failed;
- }
+ // name is always valid, checked when compiling
+ (void)get_env_tv(&name, &optval, TRUE);
*STACK_TV_BOT(0) = optval;
++ectx.ec_stack.ga_len;
}
@@ -653,16 +663,16 @@ call_def_function(
hashtab_T *ht = &SCRIPT_VARS(
iptr->isn_arg.loadstore.ls_sid);
char_u *name = iptr->isn_arg.loadstore.ls_name;
- dictitem_T *di = find_var_in_ht(ht, 0, name, TRUE);
+ dictitem_T *di = find_var_in_ht(ht, 0, name + 2, TRUE);
+ --ectx.ec_stack.ga_len;
if (di == NULL)
+ store_var(iptr->isn_arg.string, STACK_TV_BOT(0));
+ else
{
- semsg(_(e_undefvar), name);
- goto failed;
+ clear_tv(&di->di_tv);
+ di->di_tv = *STACK_TV_BOT(0);
}
- --ectx.ec_stack.ga_len;
- clear_tv(&di->di_tv);
- di->di_tv = *STACK_TV_BOT(0);
}
break;
@@ -750,14 +760,7 @@ call_def_function(
di = find_var_in_ht(get_globvar_ht(), 0,
iptr->isn_arg.string + 2, TRUE);
if (di == NULL)
- {
- funccal_entry_T entry;
-
- save_funccal(&entry);
- set_var_const(iptr->isn_arg.string, NULL,
- STACK_TV_BOT(0), FALSE, 0);
- restore_funccal();
- }
+ store_var(iptr->isn_arg.string, STACK_TV_BOT(0));
else
{
clear_tv(&di->di_tv);
@@ -1723,7 +1726,7 @@ ex_disassemble(exarg_T *eap)
scriptitem_T *si = SCRIPT_ITEM(
iptr->isn_arg.loadstore.ls_sid);
- smsg("%4d STORES s:%s in %s", current,
+ smsg("%4d STORES %s in %s", current,
iptr->isn_arg.string, si->sn_name);
}
break;