# HG changeset patch # User Bram Moolenaar # Date 1582148703 -3600 # Node ID 6556318822885aa89ffe7af3d4507dffa88c7a37 # Parent f83a66aaea4441cf6f92214fd61bb66fe8885767 patch 8.2.0285: unused error message; cannot create s:var Commit: https://github.com/vim/vim/commit/0bbf722aaaa75b1bbe87ef6afc44c5fff8e3893b Author: Bram Moolenaar 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. diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim --- 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 --- 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 --- 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); diff --git a/src/vim9execute.c b/src/vim9execute.c --- 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;