Skip to content

Commit

Permalink
patch 8.2.0121: filter() and map() on blob don't work
Browse files Browse the repository at this point in the history
Problem:    filter() and map() on blob don't work.
Solution:   Correct the code. (closes #5483)
  • Loading branch information
brammool committed Jan 15, 2020
1 parent b3d33d8 commit 49c57ce
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 12 deletions.
16 changes: 11 additions & 5 deletions src/list.c
Original file line number Diff line number Diff line change
Expand Up @@ -1689,14 +1689,16 @@ filter_map(typval_T *argvars, typval_T *rettv, int map)
{
int i;
typval_T tv;
varnumber_T val;

// set_vim_var_nr() doesn't set the type
set_vim_var_type(VV_KEY, VAR_NUMBER);

for (i = 0; i < b->bv_ga.ga_len; i++)
{
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);
if (filter_map_one(&tv, expr, map, &rem) == FAIL || did_emsg)
break;
Expand All @@ -1705,17 +1707,21 @@ filter_map(typval_T *argvars, typval_T *rettv, int map)
emsg(_(e_invalblob));
break;
}
tv.v_type = VAR_NUMBER;
blob_set(b, i, tv.vval.v_number);
if (!map && rem)
if (map)
{
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;

mch_memmove(p + idx, p + i + 1,
mch_memmove(p + i, p + i + 1,
(size_t)b->bv_ga.ga_len - i - 1);
--b->bv_ga.ga_len;
--i;
}
++idx;
}
}
else // argvars[0].v_type == VAR_LIST
Expand Down
18 changes: 11 additions & 7 deletions src/testdir/test_blob.vim
Original file line number Diff line number Diff line change
Expand Up @@ -260,18 +260,22 @@ endfunc

" filter() item in blob
func Test_blob_filter()
let b = 0zDEADBEEF
call filter(b, 'v:val != 0xEF')
call assert_equal(0zDEADBE, b)
call assert_equal(0z, filter(0zDEADBEEF, '0'))
call assert_equal(0zADBEEF, filter(0zDEADBEEF, 'v:val != 0xDE'))
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

" map() item in blob
func Test_blob_map()
let b = 0zDEADBEEF
call map(b, 'v:val + 1')
call assert_equal(0zDFAEBFF0, b)
call assert_equal(0zDFAEBFF0, map(0zDEADBEEF, 'v:val + 1'))
call assert_equal(0z00010203, map(0zDEADBEEF, 'v:key'))
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

func Test_blob_index()
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -742,6 +742,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
121,
/**/
120,
/**/
Expand Down

0 comments on commit 49c57ce

Please sign in to comment.