comparison src/vim9execute.c @ 20295:bc2c9ea94ec1 v8.2.0703

patch 8.2.0703: Vim9: closure cannot store value in outer context Commit: https://github.com/vim/vim/commit/b68b346e6db6d3f848e0a89905fcd7777b73c5d8 Author: Bram Moolenaar <Bram@vim.org> Date: Wed May 6 21:06:30 2020 +0200 patch 8.2.0703: Vim9: closure cannot store value in outer context Problem: Vim9: closure cannot store value in outer context. Solution: Make storing value in outer context work. Make :disassemble accept a function reference.
author Bram Moolenaar <Bram@vim.org>
date Wed, 06 May 2020 21:15:04 +0200
parents 208b38bddc36
children 5f0611bc6377
comparison
equal deleted inserted replaced
20294:cefbaab2e368 20295:bc2c9ea94ec1
1064 1064
1065 // store local variable 1065 // store local variable
1066 case ISN_STORE: 1066 case ISN_STORE:
1067 --ectx.ec_stack.ga_len; 1067 --ectx.ec_stack.ga_len;
1068 tv = STACK_TV_VAR(iptr->isn_arg.number); 1068 tv = STACK_TV_VAR(iptr->isn_arg.number);
1069 clear_tv(tv);
1070 *tv = *STACK_TV_BOT(0);
1071 break;
1072
1073 // store variable or argument in outer scope
1074 case ISN_STOREOUTER:
1075 --ectx.ec_stack.ga_len;
1076 tv = STACK_OUT_TV_VAR(iptr->isn_arg.number);
1069 clear_tv(tv); 1077 clear_tv(tv);
1070 *tv = *STACK_TV_BOT(0); 1078 *tv = *STACK_TV_BOT(0);
1071 break; 1079 break;
1072 1080
1073 // store s: variable in old script 1081 // store s: variable in old script
2131 int line_idx = 0; 2139 int line_idx = 0;
2132 int prev_current = 0; 2140 int prev_current = 0;
2133 int is_global = FALSE; 2141 int is_global = FALSE;
2134 2142
2135 fname = trans_function_name(&arg, &is_global, FALSE, 2143 fname = trans_function_name(&arg, &is_global, FALSE,
2136 TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD | TFN_NO_DEREF, NULL, NULL); 2144 TFN_INT | TFN_QUIET | TFN_NO_AUTOLOAD, NULL, NULL);
2137 if (fname == NULL) 2145 if (fname == NULL)
2138 { 2146 {
2139 semsg(_(e_invarg2), eap->arg); 2147 semsg(_(e_invarg2), eap->arg);
2140 return; 2148 return;
2141 } 2149 }
2273 case ISN_LOADREG: 2281 case ISN_LOADREG:
2274 smsg("%4d LOADREG @%c", current, (int)(iptr->isn_arg.number)); 2282 smsg("%4d LOADREG @%c", current, (int)(iptr->isn_arg.number));
2275 break; 2283 break;
2276 2284
2277 case ISN_STORE: 2285 case ISN_STORE:
2286 case ISN_STOREOUTER:
2287 {
2288 char *add = iptr->isn_type == ISN_STORE ? "" : "OUTER";
2289
2278 if (iptr->isn_arg.number < 0) 2290 if (iptr->isn_arg.number < 0)
2279 smsg("%4d STORE arg[%lld]", current, 2291 smsg("%4d STORE%s arg[%lld]", current, add,
2280 (long long)(iptr->isn_arg.number + STACK_FRAME_SIZE)); 2292 (long long)(iptr->isn_arg.number + STACK_FRAME_SIZE));
2281 else 2293 else
2282 smsg("%4d STORE $%lld", current, 2294 smsg("%4d STORE%s $%lld", current, add,
2283 (long long)(iptr->isn_arg.number)); 2295 (long long)(iptr->isn_arg.number));
2296 }
2284 break; 2297 break;
2285 case ISN_STOREV: 2298 case ISN_STOREV:
2286 smsg("%4d STOREV v:%s", current, 2299 smsg("%4d STOREV v:%s", current,
2287 get_vim_var_name(iptr->isn_arg.number)); 2300 get_vim_var_name(iptr->isn_arg.number));
2288 break; 2301 break;