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,