mirror of
https://github.com/vim/vim.git
synced 2025-10-04 05:25:06 -04:00
patch 8.2.0121: filter() and map() on blob don't work
Problem: filter() and map() on blob don't work. Solution: Correct the code. (closes #5483)
This commit is contained in:
16
src/list.c
16
src/list.c
@@ -1689,6 +1689,7 @@ filter_map(typval_T *argvars, typval_T *rettv, int map)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
typval_T tv;
|
typval_T tv;
|
||||||
|
varnumber_T val;
|
||||||
|
|
||||||
// set_vim_var_nr() doesn't set the type
|
// set_vim_var_nr() doesn't set the type
|
||||||
set_vim_var_type(VV_KEY, VAR_NUMBER);
|
set_vim_var_type(VV_KEY, VAR_NUMBER);
|
||||||
@@ -1696,7 +1697,8 @@ filter_map(typval_T *argvars, typval_T *rettv, int map)
|
|||||||
for (i = 0; i < b->bv_ga.ga_len; i++)
|
for (i = 0; i < b->bv_ga.ga_len; i++)
|
||||||
{
|
{
|
||||||
tv.v_type = VAR_NUMBER;
|
tv.v_type = VAR_NUMBER;
|
||||||
tv.vval.v_number = blob_get(b, i);
|
val = blob_get(b, i);
|
||||||
|
tv.vval.v_number = val;
|
||||||
set_vim_var_nr(VV_KEY, idx);
|
set_vim_var_nr(VV_KEY, idx);
|
||||||
if (filter_map_one(&tv, expr, map, &rem) == FAIL || did_emsg)
|
if (filter_map_one(&tv, expr, map, &rem) == FAIL || did_emsg)
|
||||||
break;
|
break;
|
||||||
@@ -1705,17 +1707,21 @@ filter_map(typval_T *argvars, typval_T *rettv, int map)
|
|||||||
emsg(_(e_invalblob));
|
emsg(_(e_invalblob));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
tv.v_type = VAR_NUMBER;
|
if (map)
|
||||||
blob_set(b, i, tv.vval.v_number);
|
{
|
||||||
if (!map && rem)
|
if (tv.vval.v_number != val)
|
||||||
|
blob_set(b, i, tv.vval.v_number);
|
||||||
|
}
|
||||||
|
else if (rem)
|
||||||
{
|
{
|
||||||
char_u *p = (char_u *)argvars[0].vval.v_blob->bv_ga.ga_data;
|
char_u *p = (char_u *)argvars[0].vval.v_blob->bv_ga.ga_data;
|
||||||
|
|
||||||
mch_memmove(p + idx, p + i + 1,
|
mch_memmove(p + i, p + i + 1,
|
||||||
(size_t)b->bv_ga.ga_len - i - 1);
|
(size_t)b->bv_ga.ga_len - i - 1);
|
||||||
--b->bv_ga.ga_len;
|
--b->bv_ga.ga_len;
|
||||||
--i;
|
--i;
|
||||||
}
|
}
|
||||||
|
++idx;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else // argvars[0].v_type == VAR_LIST
|
else // argvars[0].v_type == VAR_LIST
|
||||||
|
@@ -260,18 +260,22 @@ endfunc
|
|||||||
|
|
||||||
" filter() item in blob
|
" filter() item in blob
|
||||||
func Test_blob_filter()
|
func Test_blob_filter()
|
||||||
let b = 0zDEADBEEF
|
call assert_equal(0z, filter(0zDEADBEEF, '0'))
|
||||||
call filter(b, 'v:val != 0xEF')
|
call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
|
||||||
call assert_equal(0zDEADBE, b)
|
call assert_equal(0zDEADEF, filter(0zDEADBEEF, 'v:val != 0xBE'))
|
||||||
|
call assert_equal(0zDEADBE, filter(0zDEADBEEF, 'v:val != 0xEF'))
|
||||||
|
call assert_equal(0zDEADBEEF, filter(0zDEADBEEF, '1'))
|
||||||
|
call assert_equal(0z01030103, filter(0z010203010203, 'v:val != 0x02'))
|
||||||
|
call assert_equal(0zADEF, filter(0zDEADBEEF, 'v:key % 2'))
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
" map() item in blob
|
" map() item in blob
|
||||||
func Test_blob_map()
|
func Test_blob_map()
|
||||||
let b = 0zDEADBEEF
|
call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
|
||||||
call map(b, 'v:val + 1')
|
call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
|
||||||
call assert_equal(0zDFAEBFF0, b)
|
call assert_equal(0zDEAEC0F2, map(0zDEADBEEF, 'v:key + v:val'))
|
||||||
|
|
||||||
call assert_fails("call map(b, '[9]')", 'E978:')
|
call assert_fails("call map(0z00, '[9]')", 'E978:')
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_blob_index()
|
func Test_blob_index()
|
||||||
|
@@ -742,6 +742,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
121,
|
||||||
/**/
|
/**/
|
||||||
120,
|
120,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user