@@ -1983,9 +1983,9 @@ get_lval(
1983
1983
}
1984
1984
if (rettv != NULL
1985
1985
&& !(rettv -> v_type == VAR_LIST
1986
- || rettv -> vval .v_list != NULL )
1986
+ && rettv -> vval .v_list != NULL )
1987
1987
&& !(rettv -> v_type == VAR_BLOB
1988
- || rettv -> vval .v_blob != NULL ))
1988
+ && rettv -> vval .v_blob != NULL ))
1989
1989
{
1990
1990
if (!quiet )
1991
1991
EMSG (_ ("E709: [:] requires a List or Blob value" ));
@@ -2109,6 +2109,8 @@ get_lval(
2109
2109
}
2110
2110
else if (lp -> ll_tv -> v_type == VAR_BLOB )
2111
2111
{
2112
+ long bloblen = blob_len (lp -> ll_tv -> vval .v_blob );
2113
+
2112
2114
/*
2113
2115
* Get the number and item for the only or first index of the List.
2114
2116
*/
@@ -2120,16 +2122,26 @@ get_lval(
2120
2122
clear_tv (& var1 );
2121
2123
2122
2124
if (lp -> ll_n1 < 0
2123
- || lp -> ll_n1 > blob_len (lp -> ll_tv -> vval .v_blob ))
2125
+ || lp -> ll_n1 > bloblen
2126
+ || (lp -> ll_range && lp -> ll_n1 == bloblen ))
2124
2127
{
2125
2128
if (!quiet )
2126
- EMSGN (_ (e_listidx ), lp -> ll_n1 );
2129
+ EMSGN (_ (e_blobidx ), lp -> ll_n1 );
2130
+ clear_tv (& var2 );
2127
2131
return NULL ;
2128
2132
}
2129
2133
if (lp -> ll_range && !lp -> ll_empty2 )
2130
2134
{
2131
2135
lp -> ll_n2 = (long )tv_get_number (& var2 );
2132
2136
clear_tv (& var2 );
2137
+ if (lp -> ll_n2 < 0
2138
+ || lp -> ll_n2 >= bloblen
2139
+ || lp -> ll_n2 < lp -> ll_n1 )
2140
+ {
2141
+ if (!quiet )
2142
+ EMSGN (_ (e_blobidx ), lp -> ll_n2 );
2143
+ return NULL ;
2144
+ }
2133
2145
}
2134
2146
lp -> ll_blob = lp -> ll_tv -> vval .v_blob ;
2135
2147
lp -> ll_tv = NULL ;
@@ -2241,6 +2253,7 @@ set_var_lval(
2241
2253
if (lp -> ll_blob != NULL )
2242
2254
{
2243
2255
int error = FALSE, val ;
2256
+
2244
2257
if (op != NULL && * op != '=' )
2245
2258
{
2246
2259
EMSG2 (_ (e_letwrong ), op );
@@ -2249,17 +2262,23 @@ set_var_lval(
2249
2262
2250
2263
if (lp -> ll_range && rettv -> v_type == VAR_BLOB )
2251
2264
{
2252
- int i ;
2265
+ int il , ir ;
2253
2266
2254
- if (blob_len (rettv -> vval .v_blob ) != blob_len (lp -> ll_blob ))
2267
+ if (lp -> ll_empty2 )
2268
+ lp -> ll_n2 = blob_len (lp -> ll_blob ) - 1 ;
2269
+
2270
+ if (lp -> ll_n2 - lp -> ll_n1 + 1 != blob_len (rettv -> vval .v_blob ))
2255
2271
{
2256
- EMSG (_ ("E972: Blob value has more items than target " ));
2272
+ EMSG (_ ("E972: Blob value does not have the right number of bytes " ));
2257
2273
return ;
2258
2274
}
2275
+ if (lp -> ll_empty2 )
2276
+ lp -> ll_n2 = blob_len (lp -> ll_blob );
2259
2277
2260
- for (i = lp -> ll_n1 ; i <= lp -> ll_n2 ; i ++ )
2261
- blob_set (lp -> ll_blob , i ,
2262
- blob_get (rettv -> vval .v_blob , i ));
2278
+ ir = 0 ;
2279
+ for (il = lp -> ll_n1 ; il <= lp -> ll_n2 ; il ++ )
2280
+ blob_set (lp -> ll_blob , il ,
2281
+ blob_get (rettv -> vval .v_blob , ir ++ ));
2263
2282
}
2264
2283
else
2265
2284
{
@@ -2278,8 +2297,7 @@ set_var_lval(
2278
2297
if (lp -> ll_n1 == gap -> ga_len )
2279
2298
++ gap -> ga_len ;
2280
2299
}
2281
- else
2282
- EMSG (_ (e_invrange ));
2300
+ // error for invalid range was already given in get_lval()
2283
2301
}
2284
2302
}
2285
2303
}
@@ -2312,7 +2330,7 @@ set_var_lval(
2312
2330
else if (lp -> ll_range )
2313
2331
{
2314
2332
listitem_T * ll_li = lp -> ll_li ;
2315
- int ll_n1 = lp -> ll_n1 ;
2333
+ int ll_n1 = lp -> ll_n1 ;
2316
2334
2317
2335
/*
2318
2336
* Check whether any of the list items is locked
@@ -3354,6 +3372,8 @@ eval0(
3354
3372
{
3355
3373
int ret ;
3356
3374
char_u * p ;
3375
+ int did_emsg_before = did_emsg ;
3376
+ int called_emsg_before = called_emsg ;
3357
3377
3358
3378
p = skipwhite (arg );
3359
3379
ret = eval1 (& p , rettv , evaluate );
@@ -3364,9 +3384,11 @@ eval0(
3364
3384
/*
3365
3385
* Report the invalid expression unless the expression evaluation has
3366
3386
* been cancelled due to an aborting error, an interrupt, or an
3367
- * exception.
3387
+ * exception, or we already gave a more specific error.
3388
+ * Also check called_emsg for when using assert_fails().
3368
3389
*/
3369
- if (!aborting ())
3390
+ if (!aborting () && did_emsg == did_emsg_before
3391
+ && called_emsg == called_emsg_before )
3370
3392
EMSG2 (_ (e_invexpr2 ), arg );
3371
3393
ret = FAIL ;
3372
3394
}
@@ -4195,7 +4217,7 @@ eval7(
4195
4217
{
4196
4218
if (!vim_isxdigit (bp [1 ]))
4197
4219
{
4198
- EMSG (_ ("E973: Blob literal should have an even number of hex characters' " ));
4220
+ EMSG (_ ("E973: Blob literal should have an even number of hex characters" ));
4199
4221
vim_free (blob );
4200
4222
ret = FAIL ;
4201
4223
break ;
@@ -4632,7 +4654,7 @@ eval_index(
4632
4654
len = blob_len (rettv -> vval .v_blob );
4633
4655
if (range )
4634
4656
{
4635
- // The resulting variable is a substring . If the indexes
4657
+ // The resulting variable is a sub-blob . If the indexes
4636
4658
// are out of range the result is empty.
4637
4659
if (n1 < 0 )
4638
4660
{
@@ -8336,6 +8358,7 @@ ex_echo(exarg_T *eap)
8336
8358
int atstart = TRUE;
8337
8359
char_u numbuf [NUMBUFLEN ];
8338
8360
int did_emsg_before = did_emsg ;
8361
+ int called_emsg_before = called_emsg ;
8339
8362
8340
8363
if (eap -> skip )
8341
8364
++ emsg_skip ;
@@ -8353,7 +8376,8 @@ ex_echo(exarg_T *eap)
8353
8376
* has been cancelled due to an aborting error, an interrupt, or an
8354
8377
* exception.
8355
8378
*/
8356
- if (!aborting () && did_emsg == did_emsg_before )
8379
+ if (!aborting () && did_emsg == did_emsg_before
8380
+ && called_emsg == called_emsg_before )
8357
8381
EMSG2 (_ (e_invexpr2 ), p );
8358
8382
need_clr_eos = FALSE;
8359
8383
break ;
0 commit comments