Mercurial > vim
comparison src/vim9execute.c @ 20349:e29b2ec8d4d2 v8.2.0730
patch 8.2.0730: Vim9: Assignment to dict member does not work
Commit: https://github.com/vim/vim/commit/1cc2a94f80ba982f83d1e2d37c4726867e36bd9f
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun May 10 19:10:31 2020 +0200
patch 8.2.0730: Vim9: Assignment to dict member does not work
Problem: Vim9: Assignment to dict member does not work.
Solution: Parse dict assignment. Implement getting dict member.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 10 May 2020 19:15:03 +0200 |
parents | cf2620e7a6aa |
children | a8a76fd967ab |
comparison
equal
deleted
inserted
replaced
20348:25253a43acdf | 20349:e29b2ec8d4d2 |
---|---|
1248 case ISN_STORENR: | 1248 case ISN_STORENR: |
1249 tv = STACK_TV_VAR(iptr->isn_arg.storenr.stnr_idx); | 1249 tv = STACK_TV_VAR(iptr->isn_arg.storenr.stnr_idx); |
1250 clear_tv(tv); | 1250 clear_tv(tv); |
1251 tv->v_type = VAR_NUMBER; | 1251 tv->v_type = VAR_NUMBER; |
1252 tv->vval.v_number = iptr->isn_arg.storenr.stnr_val; | 1252 tv->vval.v_number = iptr->isn_arg.storenr.stnr_val; |
1253 break; | |
1254 | |
1255 // store value in list variable | |
1256 case ISN_STORELIST: | |
1257 { | |
1258 typval_T *tv_idx = STACK_TV_BOT(-2); | |
1259 varnumber_T lidx = tv_idx->vval.v_number; | |
1260 typval_T *tv_list = STACK_TV_BOT(-1); | |
1261 list_T *list = tv_list->vval.v_list; | |
1262 | |
1263 if (lidx < 0 && list->lv_len + lidx >= 0) | |
1264 // negative index is relative to the end | |
1265 lidx = list->lv_len + lidx; | |
1266 if (lidx < 0 || lidx > list->lv_len) | |
1267 { | |
1268 semsg(_(e_listidx), lidx); | |
1269 goto failed; | |
1270 } | |
1271 tv = STACK_TV_BOT(-3); | |
1272 if (lidx < list->lv_len) | |
1273 { | |
1274 listitem_T *li = list_find(list, lidx); | |
1275 | |
1276 // overwrite existing list item | |
1277 clear_tv(&li->li_tv); | |
1278 li->li_tv = *tv; | |
1279 } | |
1280 else | |
1281 { | |
1282 // append to list | |
1283 if (list_append_tv(list, tv) == FAIL) | |
1284 goto failed; | |
1285 clear_tv(tv); | |
1286 } | |
1287 clear_tv(tv_idx); | |
1288 clear_tv(tv_list); | |
1289 } | |
1290 break; | |
1291 | |
1292 // store value in dict variable | |
1293 case ISN_STOREDICT: | |
1294 { | |
1295 typval_T *tv_key = STACK_TV_BOT(-2); | |
1296 char_u *key = tv_key->vval.v_string; | |
1297 typval_T *tv_dict = STACK_TV_BOT(-1); | |
1298 dict_T *dict = tv_dict->vval.v_dict; | |
1299 dictitem_T *di; | |
1300 | |
1301 if (key == NULL || *key == NUL) | |
1302 { | |
1303 emsg(_(e_emptykey)); | |
1304 goto failed; | |
1305 } | |
1306 tv = STACK_TV_BOT(-3); | |
1307 di = dict_find(dict, key, -1); | |
1308 if (di != NULL) | |
1309 { | |
1310 clear_tv(&di->di_tv); | |
1311 di->di_tv = *tv; | |
1312 } | |
1313 else | |
1314 { | |
1315 // add to dict | |
1316 if (dict_add_tv(dict, (char *)key, tv) == FAIL) | |
1317 goto failed; | |
1318 clear_tv(tv); | |
1319 } | |
1320 clear_tv(tv_key); | |
1321 clear_tv(tv_dict); | |
1322 } | |
1253 break; | 1323 break; |
1254 | 1324 |
1255 // push constant | 1325 // push constant |
1256 case ISN_PUSHNR: | 1326 case ISN_PUSHNR: |
1257 case ISN_PUSHBOOL: | 1327 case ISN_PUSHBOOL: |
2017 clear_tv(STACK_TV_BOT(-1)); | 2087 clear_tv(STACK_TV_BOT(-1)); |
2018 copy_tv(&li->li_tv, STACK_TV_BOT(-1)); | 2088 copy_tv(&li->li_tv, STACK_TV_BOT(-1)); |
2019 } | 2089 } |
2020 break; | 2090 break; |
2021 | 2091 |
2092 case ISN_MEMBER: | |
2093 { | |
2094 dict_T *dict; | |
2095 char_u *key; | |
2096 dictitem_T *di; | |
2097 | |
2098 // dict member: dict is at stack-2, key at stack-1 | |
2099 tv = STACK_TV_BOT(-2); | |
2100 if (tv->v_type != VAR_DICT) | |
2101 { | |
2102 emsg(_(e_dictreq)); | |
2103 goto failed; | |
2104 } | |
2105 dict = tv->vval.v_dict; | |
2106 | |
2107 tv = STACK_TV_BOT(-1); | |
2108 if (tv->v_type != VAR_STRING) | |
2109 { | |
2110 emsg(_(e_stringreq)); | |
2111 goto failed; | |
2112 } | |
2113 key = tv->vval.v_string; | |
2114 if ((di = dict_find(dict, key, -1)) == NULL) | |
2115 { | |
2116 semsg(_(e_dictkey), key); | |
2117 goto failed; | |
2118 } | |
2119 --ectx.ec_stack.ga_len; | |
2120 clear_tv(tv); | |
2121 clear_tv(STACK_TV_BOT(-1)); | |
2122 copy_tv(&di->di_tv, STACK_TV_BOT(-1)); | |
2123 } | |
2124 break; | |
2125 | |
2022 // dict member with string key | 2126 // dict member with string key |
2023 case ISN_MEMBER: | 2127 case ISN_STRINGMEMBER: |
2024 { | 2128 { |
2025 dict_T *dict; | 2129 dict_T *dict; |
2026 dictitem_T *di; | 2130 dictitem_T *di; |
2027 | 2131 |
2028 tv = STACK_TV_BOT(-1); | 2132 tv = STACK_TV_BOT(-1); |
2376 break; | 2480 break; |
2377 case ISN_STORENR: | 2481 case ISN_STORENR: |
2378 smsg("%4d STORE %lld in $%d", current, | 2482 smsg("%4d STORE %lld in $%d", current, |
2379 iptr->isn_arg.storenr.stnr_val, | 2483 iptr->isn_arg.storenr.stnr_val, |
2380 iptr->isn_arg.storenr.stnr_idx); | 2484 iptr->isn_arg.storenr.stnr_idx); |
2485 break; | |
2486 | |
2487 case ISN_STORELIST: | |
2488 smsg("%4d STORELIST", current); | |
2489 break; | |
2490 | |
2491 case ISN_STOREDICT: | |
2492 smsg("%4d STOREDICT", current); | |
2381 break; | 2493 break; |
2382 | 2494 |
2383 // constants | 2495 // constants |
2384 case ISN_PUSHNR: | 2496 case ISN_PUSHNR: |
2385 smsg("%4d PUSHNR %lld", current, | 2497 smsg("%4d PUSHNR %lld", current, |
2654 case ISN_ADDBLOB: smsg("%4d ADDBLOB", current); break; | 2766 case ISN_ADDBLOB: smsg("%4d ADDBLOB", current); break; |
2655 | 2767 |
2656 // expression operations | 2768 // expression operations |
2657 case ISN_CONCAT: smsg("%4d CONCAT", current); break; | 2769 case ISN_CONCAT: smsg("%4d CONCAT", current); break; |
2658 case ISN_INDEX: smsg("%4d INDEX", current); break; | 2770 case ISN_INDEX: smsg("%4d INDEX", current); break; |
2659 case ISN_MEMBER: smsg("%4d MEMBER %s", current, | 2771 case ISN_MEMBER: smsg("%4d MEMBER", current); break; |
2772 case ISN_STRINGMEMBER: smsg("%4d MEMBER %s", current, | |
2660 iptr->isn_arg.string); break; | 2773 iptr->isn_arg.string); break; |
2661 case ISN_NEGATENR: smsg("%4d NEGATENR", current); break; | 2774 case ISN_NEGATENR: smsg("%4d NEGATENR", current); break; |
2662 | 2775 |
2663 case ISN_CHECKNR: smsg("%4d CHECKNR", current); break; | 2776 case ISN_CHECKNR: smsg("%4d CHECKNR", current); break; |
2664 case ISN_CHECKTYPE: smsg("%4d CHECKTYPE %s stack[%d]", current, | 2777 case ISN_CHECKTYPE: smsg("%4d CHECKTYPE %s stack[%d]", current, |