From 0bbf722aaaa75b1bbe87ef6afc44c5fff8e3893b Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 19 Feb 2020 22:31:48 +0100 Subject: [PATCH] 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. --- src/testdir/test_vim9_script.vim | 2 ++ src/version.c | 2 ++ src/vim9compile.c | 9 +++--- src/vim9execute.c | 51 +++++++++++++++++--------------- 4 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index 1fb08ab7e88f8..ac721a80c6211 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 c09d556d28eff..9dc3c6fa9ddfc 100644 --- a/src/version.c +++ b/src/version.c @@ -738,6 +738,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 285, /**/ 284, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 08cf0e635803b..45dbf4337f3e7 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 399720aaf5e42..6fad391d1f281 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -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;