Mercurial > vim
diff src/vim9execute.c @ 21833:e3f9528bddda v8.2.1466
patch 8.2.1466: Vim9: cannot index or slice a variable with type "any"
Commit: https://github.com/vim/vim/commit/cc673e746ab98566556ff964d7a76f2fb46d7f84
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Aug 16 17:33:35 2020 +0200
patch 8.2.1466: Vim9: cannot index or slice a variable with type "any"
Problem: Vim9: cannot index or slice a variable with type "any".
Solution: Add runtime index and slice.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 16 Aug 2020 17:45:22 +0200 |
parents | d8422de73113 |
children | b530ead4265a |
line wrap: on
line diff
--- a/src/vim9execute.c +++ b/src/vim9execute.c @@ -2297,6 +2297,32 @@ call_def_function( } break; + case ISN_ANYINDEX: + case ISN_ANYSLICE: + { + int is_slice = iptr->isn_type == ISN_ANYSLICE; + typval_T *var1, *var2; + int res; + + // index: composite is at stack-2, index at stack-1 + // slice: composite is at stack-3, indexes at stack-2 and + // stack-1 + tv = is_slice ? STACK_TV_BOT(-3) : STACK_TV_BOT(-2); + if (check_can_index(tv, TRUE, TRUE) == FAIL) + goto on_error; + var1 = is_slice ? STACK_TV_BOT(-2) : STACK_TV_BOT(-1); + var2 = is_slice ? STACK_TV_BOT(-1) : NULL; + res = eval_index_inner(tv, is_slice, + var1, var2, NULL, -1, TRUE); + clear_tv(var1); + if (is_slice) + clear_tv(var2); + ectx.ec_stack.ga_len -= is_slice ? 2 : 1; + if (res == FAIL) + goto on_error; + } + break; + case ISN_SLICE: { list_T *list; @@ -3133,6 +3159,8 @@ ex_disassemble(exarg_T *eap) case ISN_STRSLICE: smsg("%4d STRSLICE", current); break; case ISN_LISTINDEX: smsg("%4d LISTINDEX", current); break; case ISN_LISTSLICE: smsg("%4d LISTSLICE", current); break; + case ISN_ANYINDEX: smsg("%4d ANYINDEX", current); break; + case ISN_ANYSLICE: smsg("%4d ANYSLICE", current); break; case ISN_SLICE: smsg("%4d SLICE %lld", current, iptr->isn_arg.number); break; case ISN_GETITEM: smsg("%4d ITEM %lld",