Skip to content

Commit 66a14a2

Browse files
committed
Merge remote-tracking branch 'vim/master'
2 parents d5083f3 + 92f05f2 commit 66a14a2

File tree

17 files changed

+757
-426
lines changed

17 files changed

+757
-426
lines changed

src/dict.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,11 +1209,12 @@ dict_list(typval_T *argvars, typval_T *rettv, int what)
12091209
emsg(_(e_dictreq));
12101210
return;
12111211
}
1212-
if ((d = argvars[0].vval.v_dict) == NULL)
1213-
return;
12141212

12151213
if (rettv_list_alloc(rettv) == FAIL)
12161214
return;
1215+
if ((d = argvars[0].vval.v_dict) == NULL)
1216+
// empty dict behaves like an empty dict
1217+
return;
12171218

12181219
todo = (int)d->dv_hashtab.ht_used;
12191220
for (hi = d->dv_hashtab.ht_array; todo > 0; ++hi)

src/eval.c

Lines changed: 9 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ typedef struct
4545
int fi_byte_idx; // byte index in fi_string
4646
} forinfo_T;
4747

48-
static int tv_op(typval_T *tv1, typval_T *tv2, char_u *op);
4948
static int eval2(char_u **arg, typval_T *rettv, evalarg_T *evalarg);
5049
static int eval3(char_u **arg, typval_T *rettv, evalarg_T *evalarg);
5150
static int eval4(char_u **arg, typval_T *rettv, evalarg_T *evalarg);
@@ -827,7 +826,6 @@ get_lval(
827826
typval_T var1;
828827
typval_T var2;
829828
int empty1 = FALSE;
830-
listitem_T *ni;
831829
char_u *key = NULL;
832830
int len;
833831
hashtab_T *ht = NULL;
@@ -1210,23 +1208,11 @@ get_lval(
12101208

12111209
lp->ll_dict = NULL;
12121210
lp->ll_list = lp->ll_tv->vval.v_list;
1213-
lp->ll_li = list_find_index(lp->ll_list, &lp->ll_n1);
1211+
lp->ll_li = check_range_index_one(lp->ll_list, &lp->ll_n1, quiet);
12141212
if (lp->ll_li == NULL)
12151213
{
1216-
// Vim9: Allow for adding an item at the end.
1217-
if (in_vim9script() && lp->ll_n1 == lp->ll_list->lv_len
1218-
&& lp->ll_list->lv_lock == 0)
1219-
{
1220-
list_append_number(lp->ll_list, 0);
1221-
lp->ll_li = list_find_index(lp->ll_list, &lp->ll_n1);
1222-
}
1223-
if (lp->ll_li == NULL)
1224-
{
1225-
clear_tv(&var2);
1226-
if (!quiet)
1227-
semsg(_(e_listidx), lp->ll_n1);
1228-
return NULL;
1229-
}
1214+
clear_tv(&var2);
1215+
return NULL;
12301216
}
12311217

12321218
if (lp->ll_valtype != NULL)
@@ -1244,27 +1230,10 @@ get_lval(
12441230
lp->ll_n2 = (long)tv_get_number(&var2);
12451231
// is number or string
12461232
clear_tv(&var2);
1247-
if (lp->ll_n2 < 0)
1248-
{
1249-
ni = list_find(lp->ll_list, lp->ll_n2);
1250-
if (ni == NULL)
1251-
{
1252-
if (!quiet)
1253-
semsg(_(e_listidx), lp->ll_n2);
1254-
return NULL;
1255-
}
1256-
lp->ll_n2 = list_idx_of_item(lp->ll_list, ni);
1257-
}
1258-
1259-
// Check that lp->ll_n2 isn't before lp->ll_n1.
1260-
if (lp->ll_n1 < 0)
1261-
lp->ll_n1 = list_idx_of_item(lp->ll_list, lp->ll_li);
1262-
if (lp->ll_n2 < lp->ll_n1)
1263-
{
1264-
if (!quiet)
1265-
semsg(_(e_listidx), lp->ll_n2);
1233+
if (check_range_index_two(lp->ll_list,
1234+
&lp->ll_n1, lp->ll_li,
1235+
&lp->ll_n2, quiet) == FAIL)
12661236
return NULL;
1267-
}
12681237
}
12691238

12701239
lp->ll_tv = &lp->ll_li->li_tv;
@@ -1303,7 +1272,6 @@ set_var_lval(
13031272
int var_idx) // index for "let [a, b] = list"
13041273
{
13051274
int cc;
1306-
listitem_T *ri;
13071275
dictitem_T *di;
13081276

13091277
if (lp->ll_tv == NULL)
@@ -1383,63 +1351,15 @@ set_var_lval(
13831351
;
13841352
else if (lp->ll_range)
13851353
{
1386-
listitem_T *ll_li = lp->ll_li;
1387-
int ll_n1 = lp->ll_n1;
1388-
13891354
if ((flags & (ASSIGN_CONST | ASSIGN_FINAL))
13901355
&& (flags & ASSIGN_FOR_LOOP) == 0)
13911356
{
13921357
emsg(_("E996: Cannot lock a range"));
13931358
return;
13941359
}
13951360

1396-
/*
1397-
* Check whether any of the list items is locked
1398-
*/
1399-
for (ri = rettv->vval.v_list->lv_first; ri != NULL && ll_li != NULL; )
1400-
{
1401-
if (value_check_lock(ll_li->li_tv.v_lock, lp->ll_name, FALSE))
1402-
return;
1403-
ri = ri->li_next;
1404-
if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == ll_n1))
1405-
break;
1406-
ll_li = ll_li->li_next;
1407-
++ll_n1;
1408-
}
1409-
1410-
/*
1411-
* Assign the List values to the list items.
1412-
*/
1413-
for (ri = rettv->vval.v_list->lv_first; ri != NULL; )
1414-
{
1415-
if (op != NULL && *op != '=')
1416-
tv_op(&lp->ll_li->li_tv, &ri->li_tv, op);
1417-
else
1418-
{
1419-
clear_tv(&lp->ll_li->li_tv);
1420-
copy_tv(&ri->li_tv, &lp->ll_li->li_tv);
1421-
}
1422-
ri = ri->li_next;
1423-
if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == lp->ll_n1))
1424-
break;
1425-
if (lp->ll_li->li_next == NULL)
1426-
{
1427-
// Need to add an empty item.
1428-
if (list_append_number(lp->ll_list, 0) == FAIL)
1429-
{
1430-
ri = NULL;
1431-
break;
1432-
}
1433-
}
1434-
lp->ll_li = lp->ll_li->li_next;
1435-
++lp->ll_n1;
1436-
}
1437-
if (ri != NULL)
1438-
emsg(_(e_list_value_has_more_items_than_targets));
1439-
else if (lp->ll_empty2
1440-
? (lp->ll_li != NULL && lp->ll_li->li_next != NULL)
1441-
: lp->ll_n1 != lp->ll_n2)
1442-
emsg(_(e_list_value_does_not_have_enough_items));
1361+
(void)list_assign_range(lp->ll_list, rettv->vval.v_list,
1362+
lp->ll_n1, lp->ll_n2, lp->ll_empty2, op, lp->ll_name);
14431363
}
14441364
else
14451365
{
@@ -1507,7 +1427,7 @@ set_var_lval(
15071427
* and "tv1 .= tv2"
15081428
* Returns OK or FAIL.
15091429
*/
1510-
static int
1430+
int
15111431
tv_op(typval_T *tv1, typval_T *tv2, char_u *op)
15121432
{
15131433
varnumber_T n;

src/evalfunc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6591,7 +6591,8 @@ f_islocked(typval_T *argvars, typval_T *rettv)
65916591
return;
65926592

65936593
end = get_lval(tv_get_string(&argvars[0]), NULL, &lv, FALSE, FALSE,
6594-
GLV_NO_AUTOLOAD | GLV_READ_ONLY, FNE_CHECK_START);
6594+
GLV_NO_AUTOLOAD | GLV_READ_ONLY | GLV_NO_DECL,
6595+
FNE_CHECK_START);
65956596
if (end != NULL && lv.ll_name != NULL)
65966597
{
65976598
if (*end != NUL)

0 commit comments

Comments
 (0)