Mercurial > vim
diff src/vim9execute.c @ 20089:7fc5d62fe2a5 v8.2.0600
patch 8.2.0600: Vim9: cannot read or write w:, t: and b: variables
Commit: https://github.com/vim/vim/commit/d3aac2917db38f8590648ee76eebfa178fc4c069
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Apr 19 14:32:17 2020 +0200
patch 8.2.0600: Vim9: cannot read or write w:, t: and b: variables
Problem: Vim9: cannot read or write w:, t: and b: variables.
Solution: Implement load and store for w:, t: and b: variables.
(closes #5950)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 19 Apr 2020 14:45:03 +0200 |
parents | 336483164ca6 |
children | a64c16ff98b8 |
line wrap: on
line diff
--- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -446,6 +446,7 @@ store_var(char_u *name, typval_T *tv) restore_funccal(); } + /* * Execute a function by "name". * This can be a builtin function, user function or a funcref. @@ -757,16 +758,42 @@ call_def_function( } break; - // load g: variable + // load g:/b:/w:/t: variable case ISN_LOADG: + case ISN_LOADB: + case ISN_LOADW: + case ISN_LOADT: { - dictitem_T *di = find_var_in_ht(get_globvar_ht(), 0, - iptr->isn_arg.string, TRUE); + dictitem_T *di = NULL; + hashtab_T *ht = NULL; + char namespace; + switch (iptr->isn_type) + { + case ISN_LOADG: + ht = get_globvar_ht(); + namespace = 'g'; + break; + case ISN_LOADB: + ht = &curbuf->b_vars->dv_hashtab; + namespace = 'b'; + break; + case ISN_LOADW: + ht = &curwin->w_vars->dv_hashtab; + namespace = 'w'; + break; + case ISN_LOADT: + ht = &curtab->tp_vars->dv_hashtab; + namespace = 't'; + break; + default: // Cannot reach here + goto failed; + } + di = find_var_in_ht(ht, 0, iptr->isn_arg.string, TRUE); if (di == NULL) { - semsg(_("E121: Undefined variable: g:%s"), - iptr->isn_arg.string); + semsg(_("E121: Undefined variable: %c:%s"), + namespace, iptr->isn_arg.string); goto failed; } else @@ -925,13 +952,34 @@ call_def_function( goto failed; break; - // store g: variable + // store g:/b:/w:/t: variable case ISN_STOREG: + case ISN_STOREB: + case ISN_STOREW: + case ISN_STORET: { dictitem_T *di; + hashtab_T *ht; + switch (iptr->isn_type) + { + case ISN_STOREG: + ht = get_globvar_ht(); + break; + case ISN_STOREB: + ht = &curbuf->b_vars->dv_hashtab; + break; + case ISN_STOREW: + ht = &curwin->w_vars->dv_hashtab; + break; + case ISN_STORET: + ht = &curtab->tp_vars->dv_hashtab; + break; + default: // Cannot reach here + goto failed; + } --ectx.ec_stack.ga_len; - di = find_var_in_ht(get_globvar_ht(), 0, + di = find_var_in_ht(ht, 0, iptr->isn_arg.string + 2, TRUE); if (di == NULL) store_var(iptr->isn_arg.string, STACK_TV_BOT(0)); @@ -1918,6 +1966,15 @@ ex_disassemble(exarg_T *eap) case ISN_LOADG: smsg("%4d LOADG g:%s", current, iptr->isn_arg.string); break; + case ISN_LOADB: + smsg("%4d LOADB b:%s", current, iptr->isn_arg.string); + break; + case ISN_LOADW: + smsg("%4d LOADW w:%s", current, iptr->isn_arg.string); + break; + case ISN_LOADT: + smsg("%4d LOADT t:%s", current, iptr->isn_arg.string); + break; case ISN_LOADOPT: smsg("%4d LOADOPT %s", current, iptr->isn_arg.string); break; @@ -1943,6 +2000,15 @@ ex_disassemble(exarg_T *eap) case ISN_STOREG: smsg("%4d STOREG %s", current, iptr->isn_arg.string); break; + case ISN_STOREB: + smsg("%4d STOREB %s", current, iptr->isn_arg.string); + break; + case ISN_STOREW: + smsg("%4d STOREW %s", current, iptr->isn_arg.string); + break; + case ISN_STORET: + smsg("%4d STORET %s", current, iptr->isn_arg.string); + break; case ISN_STORES: { scriptitem_T *si = SCRIPT_ITEM(