]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.0121: filter() and map() on blob don't work v8.2.0121
authorBram Moolenaar <Bram@vim.org>
Wed, 15 Jan 2020 19:51:34 +0000 (20:51 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 15 Jan 2020 19:51:34 +0000 (20:51 +0100)
Problem:    filter() and map() on blob don't work.
Solution:   Correct the code. (closes #5483)

src/list.c
src/testdir/test_blob.vim
src/version.c

index 6f475fcef0e2388bd11b9f9147ad4f427eeb96be..68be0345238111ac7d21491a5080bb284463805e 100644 (file)
@@ -1689,6 +1689,7 @@ 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);
@@ -1696,7 +1697,8 @@ filter_map(typval_T *argvars, typval_T *rettv, int map)
            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;
@@ -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
index a4e9bea304d32728a4d591d2449d63df40193fec..18d9c8a45bd8f6a5aa0ccd733d93319955651f96 100644 (file)
@@ -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()
index e20bf5d243c4a44b36dc4281039251b5516d45a4..e26d15ec503258877dfa8d8e602977d404e61680 100644 (file)
@@ -742,6 +742,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    121,
 /**/
     120,
 /**/