diff src/vim9execute.c @ 23233:657216220293 v8.2.2162

patch 8.2.2162: Vim9: Cannot load or store autoload variables Commit: https://github.com/vim/vim/commit/03290b8444b69c6d7307755770467bc488384e1a Author: Bram Moolenaar <Bram@vim.org> Date: Sat Dec 19 16:30:44 2020 +0100 patch 8.2.2162: Vim9: Cannot load or store autoload variables Problem: Vim9: Cannot load or store autoload variables. Solution: Add ISN_LOADAUTO and ISN_STOREAUTO. (closes https://github.com/vim/vim/issues/7485)
author Bram Moolenaar <Bram@vim.org>
date Sat, 19 Dec 2020 16:45:06 +0100
parents b545334ae654
children 43532077b5ff
line wrap: on
line diff
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -1391,6 +1391,21 @@ call_def_function(
 		}
 		break;
 
+	    // load autoload variable
+	    case ISN_LOADAUTO:
+		{
+		    char_u *name = iptr->isn_arg.string;
+
+		    if (GA_GROW(&ectx.ec_stack, 1) == FAIL)
+			goto failed;
+		    SOURCING_LNUM = iptr->isn_lnum;
+		    if (eval_variable(name, STRLEN(name),
+				  STACK_TV_BOT(0), NULL, TRUE, FALSE) == FAIL)
+			goto on_error;
+		    ++ectx.ec_stack.ga_len;
+		}
+		break;
+
 	    // load g:/b:/w:/t: namespace
 	    case ISN_LOADGDICT:
 	    case ISN_LOADBDICT:
@@ -1611,6 +1626,14 @@ call_def_function(
 		}
 		break;
 
+	    // store an autoload variable
+	    case ISN_STOREAUTO:
+		SOURCING_LNUM = iptr->isn_lnum;
+		set_var(iptr->isn_arg.string, STACK_TV_BOT(-1), TRUE);
+		clear_tv(STACK_TV_BOT(-1));
+		--ectx.ec_stack.ga_len;
+		break;
+
 	    // store number in local variable
 	    case ISN_STORENR:
 		tv = STACK_TV_VAR(iptr->isn_arg.storenr.stnr_idx);
@@ -3286,6 +3309,9 @@ ex_disassemble(exarg_T *eap)
 				 iptr->isn_arg.loadstore.ls_name, si->sn_name);
 		}
 		break;
+	    case ISN_LOADAUTO:
+		smsg("%4d LOADAUTO %s", current, iptr->isn_arg.string);
+		break;
 	    case ISN_LOADG:
 		smsg("%4d LOADG g:%s", current, iptr->isn_arg.string);
 		break;
@@ -3337,6 +3363,9 @@ ex_disassemble(exarg_T *eap)
 		smsg("%4d STOREV v:%s", current,
 				       get_vim_var_name(iptr->isn_arg.number));
 		break;
+	    case ISN_STOREAUTO:
+		smsg("%4d STOREAUTO %s", current, iptr->isn_arg.string);
+		break;
 	    case ISN_STOREG:
 		smsg("%4d STOREG %s", current, iptr->isn_arg.string);
 		break;