@@ -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 );
4948static int eval2 (char_u * * arg , typval_T * rettv , evalarg_T * evalarg );
5049static int eval3 (char_u * * arg , typval_T * rettv , evalarg_T * evalarg );
5150static 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
15111431tv_op (typval_T * tv1 , typval_T * tv2 , char_u * op )
15121432{
15131433 varnumber_T n ;
0 commit comments