changeset 19455:655631882288 v8.2.0285

patch 8.2.0285: unused error message; cannot create s:var Commit: https://github.com/vim/vim/commit/0bbf722aaaa75b1bbe87ef6afc44c5fff8e3893b Author: Bram Moolenaar <Bram@vim.org> Date: Wed Feb 19 22:31:48 2020 +0100 patch 8.2.0285: unused error message; cannot create s:var Problem: Unused error message. Cannot create s:var. Solution: Remove the error message. Make assignment to s:var work.
author Bram Moolenaar <Bram@vim.org>
date Wed, 19 Feb 2020 22:45:03 +0100
parents f83a66aaea44
children c35caa98fe6a
files src/testdir/test_vim9_script.vim src/version.c src/vim9compile.c src/vim9execute.c
diffstat 4 files changed, 35 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- 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()
--- 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,
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -3284,10 +3284,9 @@ compile_assignment(char_u *arg, exarg_T 
 		}
 	    }
 	}
-	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 
 		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);
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -356,6 +356,20 @@ call_partial(typval_T *tv, int argcount,
 }
 
 /*
+ * 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;
+		    dictitem_T *di = find_var_in_ht(get_globvar_ht(), 0,
+						   iptr->isn_arg.string, TRUE);
 
-		    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;