Patch 8.2.2777
Problem:    Vim9: blob operations not tested in all ways.
Solution:   Run tests with CheckLegacyAndVim9Success().  Make blob assign with
            index work.
Files:      src/vim9compile.c, src/vim9execute.c, src/errors.h, src/blob.c,
            src/proto/blob.pro, src/testdir/test_blob.vim,
            src/testdir/test_vim9_disassemble.vim


*** ../vim-8.2.2776/src/vim9compile.c   2021-04-17 17:59:15.819846298 +0200
--- src/vim9compile.c   2021-04-17 20:34:01.215930951 +0200
***************
*** 6209,6222 ****
        }
        if (dest_type == VAR_DICT && may_generate_2STRING(-1, cctx) == FAIL)
            return FAIL;
!       if (dest_type == VAR_LIST)
        {
!           if (range
!                 && need_type(((type_T **)stack->ga_data)[stack->ga_len - 2],
!                                &t_number, -1, 0, cctx, FALSE, FALSE) == FAIL)
                return FAIL;
!           if (need_type(((type_T **)stack->ga_data)[stack->ga_len - 1],
!                                &t_number, -1, 0, cctx, FALSE, FALSE) == FAIL)
                return FAIL;
        }
      }
--- 6209,6229 ----
        }
        if (dest_type == VAR_DICT && may_generate_2STRING(-1, cctx) == FAIL)
            return FAIL;
!       if (dest_type == VAR_LIST || dest_type == VAR_BLOB)
        {
!           type_T *type;
! 
!           if (range)
!           {
!               type = ((type_T **)stack->ga_data)[stack->ga_len - 2];
!               if (need_type(type, &t_number,
!                                           -1, 0, cctx, FALSE, FALSE) == FAIL)
                return FAIL;
!           }
!           type = ((type_T **)stack->ga_data)[stack->ga_len - 1];
!           if ((dest_type != VAR_BLOB || type != &t_special)
!                   && need_type(type, &t_number,
!                                           -1, 0, cctx, FALSE, FALSE) == FAIL)
                return FAIL;
        }
      }
*** ../vim-8.2.2776/src/vim9execute.c   2021-04-17 17:59:15.819846298 +0200
--- src/vim9execute.c   2021-04-17 20:20:52.028268397 +0200
***************
*** 2221,2227 ****
                    }
                    else if (status == OK && dest_type == VAR_BLOB)
                    {
!                       // TODO
                    }
                    else
                    {
--- 2221,2255 ----
                    }
                    else if (status == OK && dest_type == VAR_BLOB)
                    {
!                       long        lidx = (long)tv_idx->vval.v_number;
!                       blob_T      *blob = tv_dest->vval.v_blob;
!                       varnumber_T nr;
!                       int         error = FALSE;
!                       int         len;
! 
!                       if (blob == NULL)
!                       {
!                           emsg(_(e_blob_not_set));
!                           goto on_error;
!                       }
!                       len = blob_len(blob);
!                       if (lidx < 0 && len + lidx >= 0)
!                           // negative index is relative to the end
!                           lidx = len + lidx;
! 
!                       // Can add one byte at the end.
!                       if (lidx < 0 || lidx > len)
!                       {
!                           semsg(_(e_blobidx), lidx);
!                           goto on_error;
!                       }
!                       if (value_check_lock(blob->bv_lock,
!                                                     (char_u *)"blob", FALSE))
!                           goto on_error;
!                       nr = tv_get_number_chk(tv, &error);
!                       if (error)
!                           goto on_error;
!                       blob_set_append(blob, lidx, nr);
                    }
                    else
                    {
***************
*** 4415,4433 ****
                break;
  
            case ISN_STOREINDEX:
!               switch (iptr->isn_arg.vartype)
!               {
!                   case VAR_LIST:
!                           smsg("%4d STORELIST", current);
!                           break;
!                   case VAR_DICT:
!                           smsg("%4d STOREDICT", current);
!                           break;
!                   case VAR_ANY:
!                           smsg("%4d STOREINDEX", current);
!                           break;
!                   default: break;
!               }
                break;
  
            case ISN_STORERANGE:
--- 4443,4450 ----
                break;
  
            case ISN_STOREINDEX:
!               smsg("%4d STOREINDEX %s", current,
!                                         vartype_name(iptr->isn_arg.vartype));
                break;
  
            case ISN_STORERANGE:
*** ../vim-8.2.2776/src/errors.h        2021-04-14 20:35:19.400232653 +0200
--- src/errors.h        2021-04-17 20:11:15.597023429 +0200
***************
*** 403,405 ****
--- 403,407 ----
        INIT(= N_("E1182: Blob required"));
  EXTERN char e_cannot_use_range_with_assignment_operator_str[]
        INIT(= N_("E1183: Cannot use a range with an assignment operator: %s"));
+ EXTERN char e_blob_not_set[]
+       INIT(= N_("E1184: Blob not set"));
*** ../vim-8.2.2776/src/blob.c  2021-04-14 21:30:02.923966486 +0200
--- src/blob.c  2021-04-17 20:20:20.232207749 +0200
***************
*** 125,137 ****
  }
  
  /*
!  * Store one byte "c" in blob "b" at "idx".
   * Caller must make sure that "idx" is valid.
   */
      void
! blob_set(blob_T *b, int idx, char_u c)
  {
!     ((char_u*)b->bv_ga.ga_data)[idx] = c;
  }
  
  /*
--- 125,157 ----
  }
  
  /*
!  * Store one byte "byte" in blob "blob" at "idx".
   * Caller must make sure that "idx" is valid.
   */
      void
! blob_set(blob_T *blob, int idx, int byte)
  {
!     ((char_u*)blob->bv_ga.ga_data)[idx] = byte;
! }
! 
! /*
!  * Store one byte "byte" in blob "blob" at "idx".
!  * Append one byte if needed.
!  */
!     void
! blob_set_append(blob_T *blob, int idx, int byte)
! {
!     garray_T *gap = &blob->bv_ga;
! 
!     // Allow for appending a byte.  Setting a byte beyond
!     // the end is an error otherwise.
!     if (idx < gap->ga_len
!           || (idx == gap->ga_len && ga_grow(gap, 1) == OK))
!     {
!       blob_set(blob, idx, byte);
!       if (idx == gap->ga_len)
!           ++gap->ga_len;
!     }
  }
  
  /*
*** ../vim-8.2.2776/src/proto/blob.pro  2021-04-14 21:30:02.927966474 +0200
--- src/proto/blob.pro  2021-04-17 20:20:06.120177865 +0200
***************
*** 7,13 ****
  void blob_unref(blob_T *b);
  long blob_len(blob_T *b);
  int blob_get(blob_T *b, int idx);
! void blob_set(blob_T *b, int idx, char_u c);
  int blob_equal(blob_T *b1, blob_T *b2);
  int read_blob(FILE *fd, blob_T *blob);
  int write_blob(FILE *fd, blob_T *blob);
--- 7,14 ----
  void blob_unref(blob_T *b);
  long blob_len(blob_T *b);
  int blob_get(blob_T *b, int idx);
! void blob_set(blob_T *blob, int idx, int byte);
! void blob_set_append(blob_T *blob, int idx, int byte);
  int blob_equal(blob_T *b1, blob_T *b2);
  int read_blob(FILE *fd, blob_T *blob);
  int write_blob(FILE *fd, blob_T *blob);
*** ../vim-8.2.2776/src/testdir/test_blob.vim   2021-04-14 20:35:19.412232623 
+0200
--- src/testdir/test_blob.vim   2021-04-17 20:38:09.607446820 +0200
***************
*** 120,207 ****
  endfunc
  
  func Test_blob_get_range()
    let b = 0z0011223344
    call assert_equal(0z2233, b[2:3])
-   call assert_equal(0z223344, b[2:-1])
-   call assert_equal(0z00, b[0:-5])
-   call assert_equal(0z, b[0:-11])
-   call assert_equal(0z44, b[-1:])
-   call assert_equal(0z0011223344, b[:])
-   call assert_equal(0z0011223344, b[:-1])
-   call assert_equal(0z, b[5:6])
-   call assert_equal(0z0011, b[-10:1])
  endfunc
  
  func Test_blob_get()
!   let b = 0z0011223344
!   call assert_equal(0x00, get(b, 0))
!   call assert_equal(0x22, get(b, 2, 999))
!   call assert_equal(0x44, get(b, 4))
!   call assert_equal(0x44, get(b, -1))
!   call assert_equal(-1, get(b, 5))
!   call assert_equal(999, get(b, 5, 999))
!   call assert_equal(-1, get(b, -8))
!   call assert_equal(999, get(b, -8, 999))
!   call assert_equal(10, get(test_null_blob(), 2, 10))
! 
!   call assert_equal(0x00, b[0])
!   call assert_equal(0x22, b[2])
!   call assert_equal(0x44, b[4])
!   call assert_equal(0x44, b[-1])
!   call assert_fails('echo b[5]', 'E979:')
!   call assert_fails('echo b[-8]', 'E979:')
  endfunc
  
  func Test_blob_to_string()
!   let b = 0z00112233445566778899aabbccdd
!   call assert_equal('0z00112233.44556677.8899AABB.CCDD', string(b))
!   call assert_equal(b, eval(string(b)))
!   call remove(b, 4, -1)
!   call assert_equal('0z00112233', string(b))
!   call remove(b, 0, 3)
!   call assert_equal('0z', string(b))
!   call assert_equal('0z', string(test_null_blob()))
  endfunc
  
  func Test_blob_compare()
!   let b1 = 0z0011
!   let b2 = 0z1100
!   let b3 = 0z001122
!   call assert_true(b1 == b1)
!   call assert_false(b1 == b2)
!   call assert_false(b1 == b3)
!   call assert_true(b1 != b2)
!   call assert_true(b1 != b3)
!   call assert_true(b1 == 0z0011)
!   call assert_fails('echo b1 == 9', 'E977:')
!   call assert_fails('echo b1 != 9', 'E977:')
! 
!   call assert_false(b1 is b2)
!   let b2 = b1
!   call assert_true(b1 == b2)
!   call assert_true(b1 is b2)
!   let b2 = copy(b1)
!   call assert_true(b1 == b2)
!   call assert_false(b1 is b2)
!   let b2 = b1[:]
!   call assert_true(b1 == b2)
!   call assert_false(b1 is b2)
!   call assert_true(b1 isnot b2)
! 
!   call assert_fails('let x = b1 > b2')
!   call assert_fails('let x = b1 < b2')
!   call assert_fails('let x = b1 - b2')
!   call assert_fails('let x = b1 / b2')
!   call assert_fails('let x = b1 * b2')
! endfunc
! 
! " test for range assign
! func Test_blob_range_assign()
!   let b = 0z00
!   let b[1] = 0x11
!   let b[2] = 0x22
!   call assert_equal(0z001122, b)
!   call assert_fails('let b[4] = 0x33', 'E979:')
  endfunc
  
  func Test_blob_for_loop()
--- 120,285 ----
  endfunc
  
  func Test_blob_get_range()
+   let lines =<< trim END
+       VAR b = 0z0011223344
+       call assert_equal(0z2233, b[2 : 3])
+       call assert_equal(0z223344, b[2 : -1])
+       call assert_equal(0z00, b[0 : -5])
+       call assert_equal(0z, b[0 : -11])
+       call assert_equal(0z44, b[-1 :])
+       call assert_equal(0z0011223344, b[:])
+       call assert_equal(0z0011223344, b[: -1])
+       call assert_equal(0z, b[5 : 6])
+       call assert_equal(0z0011, b[-10 : 1])
+   END
+   call CheckLegacyAndVim9Success(lines)
+ 
+   " legacy script white space
    let b = 0z0011223344
    call assert_equal(0z2233, b[2:3])
  endfunc
  
  func Test_blob_get()
!   let lines =<< trim END
!       VAR b = 0z0011223344
!       call assert_equal(0x00, get(b, 0))
!       call assert_equal(0x22, get(b, 2, 999))
!       call assert_equal(0x44, get(b, 4))
!       call assert_equal(0x44, get(b, -1))
!       call assert_equal(-1, get(b, 5))
!       call assert_equal(999, get(b, 5, 999))
!       call assert_equal(-1, get(b, -8))
!       call assert_equal(999, get(b, -8, 999))
!       call assert_equal(10, get(test_null_blob(), 2, 10))
! 
!       call assert_equal(0x00, b[0])
!       call assert_equal(0x22, b[2])
!       call assert_equal(0x44, b[4])
!       call assert_equal(0x44, b[-1])
!   END
!   call CheckLegacyAndVim9Success(lines)
! 
!   let lines =<< trim END
!       VAR b = 0z0011223344
!       echo b[5]
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E979:')
! 
!   let lines =<< trim END
!       VAR b = 0z0011223344
!       echo b[-8]
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E979:')
  endfunc
  
  func Test_blob_to_string()
!   let lines =<< trim END
!       VAR b = 0z00112233445566778899aabbccdd
!       call assert_equal('0z00112233.44556677.8899AABB.CCDD', string(b))
!       call assert_equal(b, eval(string(b)))
!       call remove(b, 4, -1)
!       call assert_equal('0z00112233', string(b))
!       call remove(b, 0, 3)
!       call assert_equal('0z', string(b))
!       call assert_equal('0z', string(test_null_blob()))
!   END
!   call CheckLegacyAndVim9Success(lines)
  endfunc
  
  func Test_blob_compare()
!   let lines =<< trim END
!       VAR b1 = 0z0011
!       VAR b2 = 0z1100
!       VAR b3 = 0z001122
!       call assert_true(b1 == b1)
!       call assert_false(b1 == b2)
!       call assert_false(b1 == b3)
!       call assert_true(b1 != b2)
!       call assert_true(b1 != b3)
!       call assert_true(b1 == 0z0011)
! 
!       call assert_false(b1 is b2)
!       LET b2 = b1
!       call assert_true(b1 == b2)
!       call assert_true(b1 is b2)
!       LET b2 = copy(b1)
!       call assert_true(b1 == b2)
!       call assert_false(b1 is b2)
!       LET b2 = b1[:]
!       call assert_true(b1 == b2)
!       call assert_false(b1 is b2)
!       call assert_true(b1 isnot b2)
!   END
!   call CheckLegacyAndVim9Success(lines)
! 
!   let lines =<< trim END
!       VAR b1 = 0z0011
!       echo b1 == 9
!   END
!   call CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
! 
!   let lines =<< trim END
!       VAR b1 = 0z0011
!       echo b1 != 9
!   END
!   call CheckLegacyAndVim9Failure(lines, ['E977:', 'E1072', 'E1072'])
! 
!   let lines =<< trim END
!       VAR b1 = 0z0011
!       VAR b2 = 0z1100
!       VAR x = b1 > b2
!   END
!   call CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
! 
!   let lines =<< trim END
!       VAR b1 = 0z0011
!       VAR b2 = 0z1100
!       VAR x = b1 < b2
!   END
!   call CheckLegacyAndVim9Failure(lines, ['E978:', 'E1072:', 'E1072:'])
! 
!   let lines =<< trim END
!       VAR b1 = 0z0011
!       VAR b2 = 0z1100
!       VAR x = b1 - b2
!   END
!   call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
! 
!   let lines =<< trim END
!       VAR b1 = 0z0011
!       VAR b2 = 0z1100
!       VAR x = b1 / b2
!   END
!   call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
! 
!   let lines =<< trim END
!       VAR b1 = 0z0011
!       VAR b2 = 0z1100
!       VAR x = b1 * b2
!   END
!   call CheckLegacyAndVim9Failure(lines, ['E974:', 'E1036:', 'E974:'])
! endfunc
! 
! func Test_blob_index_assign()
!   let lines =<< trim END
!       VAR b = 0z00
!       LET b[1] = 0x11
!       LET b[2] = 0x22
!       call assert_equal(0z001122, b)
!   END
!   call CheckLegacyAndVim9Success(lines)
! 
!   let lines =<< trim END
!       VAR b = 0z00
!       LET b[2] = 0x33
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E979:')
! 
!   let lines =<< trim END
!       VAR b = 0z00
!       LET b[-2] = 0x33
!   END
!   call CheckLegacyAndVim9Failure(lines, 'E979:')
  endfunc
  
  func Test_blob_for_loop()
*** ../vim-8.2.2776/src/testdir/test_vim9_disassemble.vim       2021-04-14 
12:39:56.656454570 +0200
--- src/testdir/test_vim9_disassemble.vim       2021-04-17 20:43:13.202759951 
+0200
***************
*** 246,251 ****
--- 246,253 ----
    locallist[0] = 123
    var localdict: dict<number> = {}
    localdict["a"] = 456
+   var localblob: blob = 0z1122
+   localblob[1] = 33
  enddef
  
  def Test_disassemble_store_member()
***************
*** 259,265 ****
          '\d PUSHNR 123\_s*' ..
          '\d PUSHNR 0\_s*' ..
          '\d LOAD $0\_s*' ..
!         '\d STORELIST\_s*' ..
          'var localdict: dict<number> = {}\_s*' ..
          '\d NEWDICT size 0\_s*' ..
          '\d SETTYPE dict<number>\_s*' ..
--- 261,267 ----
          '\d PUSHNR 123\_s*' ..
          '\d PUSHNR 0\_s*' ..
          '\d LOAD $0\_s*' ..
!         '\d STOREINDEX list\_s*' ..
          'var localdict: dict<number> = {}\_s*' ..
          '\d NEWDICT size 0\_s*' ..
          '\d SETTYPE dict<number>\_s*' ..
***************
*** 268,274 ****
          '\d\+ PUSHNR 456\_s*' ..
          '\d\+ PUSHS "a"\_s*' ..
          '\d\+ LOAD $1\_s*' ..
!         '\d\+ STOREDICT\_s*' ..
          '\d\+ RETURN 0',
          res)
  enddef
--- 270,284 ----
          '\d\+ PUSHNR 456\_s*' ..
          '\d\+ PUSHS "a"\_s*' ..
          '\d\+ LOAD $1\_s*' ..
!         '\d\+ STOREINDEX dict\_s*' ..
!         'var localblob: blob = 0z1122\_s*' ..
!         '\d\+ PUSHBLOB 0z1122\_s*' ..
!         '\d\+ STORE $2\_s*' ..
!         'localblob\[1\] = 33\_s*' ..
!         '\d\+ PUSHNR 33\_s*' ..
!         '\d\+ PUSHNR 1\_s*' ..
!         '\d\+ LOAD $2\_s*' ..
!         '\d\+ STOREINDEX blob\_s*' ..
          '\d\+ RETURN 0',
          res)
  enddef
***************
*** 291,297 ****
          '\d PUSHNR 0\_s*' ..
          '\d LOAD $0\_s*' ..
          '\d MEMBER dd\_s*' ..
!         '\d STOREINDEX\_s*' ..
          '\d\+ RETURN 0',
          res)
  enddef
--- 301,307 ----
          '\d PUSHNR 0\_s*' ..
          '\d LOAD $0\_s*' ..
          '\d MEMBER dd\_s*' ..
!         '\d STOREINDEX any\_s*' ..
          '\d\+ RETURN 0',
          res)
  enddef
*** ../vim-8.2.2776/src/version.c       2021-04-17 18:38:49.888758511 +0200
--- src/version.c       2021-04-17 20:43:30.762718027 +0200
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     2777,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
115. You are late picking up your kid from school and try to explain
     to the teacher you were stuck in Web traffic.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202104171845.13HIjRip120796%40masaka.moolenaar.net.

Raspunde prin e-mail lui