summaryrefslogtreecommitdiff
path: root/src/vim9execute.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vim9execute.c')
-rw-r--r--src/vim9execute.c81
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,