]> granicus.if.org Git - vim/commitdiff
patch 8.2.0285: unused error message; cannot create s:var v8.2.0285
authorBram Moolenaar <Bram@vim.org>
Wed, 19 Feb 2020 21:31:48 +0000 (22:31 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 19 Feb 2020 21:31:48 +0000 (22:31 +0100)
Problem:    Unused error message. Cannot create s:var.
Solution:   Remove the error message. Make assignment to s:var work.

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c
src/vim9execute.c

index 1fb08ab7e88f8e0e7f092de002982129598e211b..ac721a80c6211835a3a791e2513d9a29078e4207 100644 (file)
@@ -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()
index c09d556d28eff07a58ade74964dc1a31c4b4b334..9dc3c6fa9ddfc8f300a9cfc943d4049895b274aa 100644 (file)
@@ -738,6 +738,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    285,
 /**/
     284,
 /**/
index 08cf0e635803b3a262ff29290e2fe4e5383910f8..45dbf4337f3e7aa3950d66c2c2d51c7b766b5fae 100644 (file)
@@ -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);
index 399720aaf5e421e496aad15790eaa992c7524002..6fad391d1f281525f2218087bdb04536664b01d6 100644 (file)
@@ -355,6 +355,20 @@ call_partial(typval_T *tv, int argcount, ectx_T *ectx)
     return OK;
 }
 
+/*
+ * 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;