diff options
Diffstat (limited to 'src/vim9execute.c')
-rw-r--r-- | src/vim9execute.c | 81 |
1 files changed, 73 insertions, 8 deletions
diff --git a/src/vim9execute.c b/src/vim9execute.c index 3d7a2fc44..e4aa7fe8d 100644 --- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -488,7 +488,7 @@ call_def_function( ++ectx.ec_stack.ga_len; break; - // load s: variable in vim9script + // load s: variable in Vim9 script case ISN_LOADSCRIPT: { scriptitem_T *si = @@ -507,12 +507,13 @@ call_def_function( // load s: variable in old script case ISN_LOADS: { - hashtab_T *ht = &SCRIPT_VARS(iptr->isn_arg.loads.ls_sid); - char_u *name = iptr->isn_arg.loads.ls_name; + 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); if (di == NULL) { - semsg(_("E121: Undefined variable: s:%s"), name); + semsg(_(e_undefvar), name); goto failed; } else @@ -601,7 +602,26 @@ call_def_function( *tv = *STACK_TV_BOT(0); break; - // store script-local variable + // store s: variable in old script + case ISN_STORES: + { + 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); + + if (di == NULL) + { + semsg(_(e_undefvar), name); + goto failed; + } + --ectx.ec_stack.ga_len; + clear_tv(&di->di_tv); + di->di_tv = *STACK_TV_BOT(0); + } + break; + + // store script-local variable in Vim9 script case ISN_STORESCRIPT: { scriptitem_T *si = SCRIPT_ITEM( @@ -648,6 +668,32 @@ call_def_function( } break; + // store $ENV + case ISN_STOREENV: + --ectx.ec_stack.ga_len; + vim_setenv_ext(iptr->isn_arg.string, + tv_get_string(STACK_TV_BOT(0))); + break; + + // store @r + case ISN_STOREREG: + { + int reg = iptr->isn_arg.number; + + --ectx.ec_stack.ga_len; + write_reg_contents(reg == '@' ? '"' : reg, + tv_get_string(STACK_TV_BOT(0)), -1, FALSE); + } + break; + + // store v: variable + case ISN_STOREV: + --ectx.ec_stack.ga_len; + if (set_vim_var_tv(iptr->isn_arg.number, STACK_TV_BOT(0)) + == FAIL) + goto failed; + break; + // store g: variable case ISN_STOREG: { @@ -1583,7 +1629,8 @@ ex_disassemble(exarg_T *eap) break; case ISN_LOADS: { - scriptitem_T *si = SCRIPT_ITEM(iptr->isn_arg.loads.ls_sid); + scriptitem_T *si = SCRIPT_ITEM( + iptr->isn_arg.loadstore.ls_sid); smsg("%4d LOADS s:%s from %s", current, iptr->isn_arg.string, si->sn_name); @@ -1605,8 +1652,21 @@ ex_disassemble(exarg_T *eap) case ISN_STORE: smsg("%4d STORE $%lld", current, iptr->isn_arg.number); break; + case ISN_STOREV: + smsg("%4d STOREV v:%s", current, + get_vim_var_name(iptr->isn_arg.number)); + break; case ISN_STOREG: - smsg("%4d STOREG g:%s", current, iptr->isn_arg.string); + smsg("%4d STOREG %s", current, iptr->isn_arg.string); + break; + case ISN_STORES: + { + scriptitem_T *si = SCRIPT_ITEM( + iptr->isn_arg.loadstore.ls_sid); + + smsg("%4d STORES s:%s in %s", current, + iptr->isn_arg.string, si->sn_name); + } break; case ISN_STORESCRIPT: { @@ -1623,7 +1683,12 @@ ex_disassemble(exarg_T *eap) smsg("%4d STOREOPT &%s", current, iptr->isn_arg.storeopt.so_name); break; - + case ISN_STOREENV: + smsg("%4d STOREENV $%s", current, iptr->isn_arg.string); + break; + case ISN_STOREREG: + smsg("%4d STOREREG @%c", current, iptr->isn_arg.number); + break; case ISN_STORENR: smsg("%4d STORE %lld in $%d", current, iptr->isn_arg.storenr.str_val, |