Mercurial > vim
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; |