Patch 8.1.2325
Problem:    Crash when using balloon with empty line.
Solution:   Handle empty lines. (Markus Braun)
Files:      src/popupmenu.c, src/testdir/test_popup.vim


*** ../vim-8.1.2324/src/popupmenu.c     2019-11-21 12:12:07.921993053 +0100
--- src/popupmenu.c     2019-11-21 13:19:20.029312180 +0100
***************
*** 1209,1250 ****
        int     cells;
  
        item = ((balpart_T *)ga.ga_data) + item_idx;
!       for (skip = 0; skip < item->bytelen; skip += thislen)
!       {
!           if (split_long_items && item->cells >= BALLOON_MIN_WIDTH)
            {
!               cells = item->indent * 2;
!               for (p = item->start + skip; p < item->start + item->bytelen;
                                                            p += mb_ptr2len(p))
!                   if ((cells += ptr2cells(p)) > BALLOON_MIN_WIDTH)
!                       break;
!               thislen = p - (item->start + skip);
!           }
!           else
!               thislen = item->bytelen;
  
!           // put indent at the start
!           p = alloc(thislen + item->indent * 2 + 1);
!           if (p == NULL)
!           {
!               for (line = 0; line <= height - 1; ++line)
!                   vim_free((*array)[line].pum_text);
!               vim_free(*array);
!               goto failed;
!           }
!           for (ind = 0; ind < item->indent * 2; ++ind)
!               p[ind] = ' ';
  
!           // exclude spaces at the end of the string
!           for (copylen = thislen; copylen > 0; --copylen)
!               if (item->start[skip + copylen - 1] != ' ')
!                   break;
  
!           vim_strncpy(p + ind, item->start + skip, copylen);
!           (*array)[line].pum_text = p;
!           item->indent = 0;  /* wrapped line has no indent */
!           ++line;
!       }
      }
      ga_clear(&ga);
      return height;
--- 1209,1254 ----
        int     cells;
  
        item = ((balpart_T *)ga.ga_data) + item_idx;
!       if (item->bytelen == 0)
!           (*array)[line++].pum_text = vim_strsave((char_u *)"");
!       else
!           for (skip = 0; skip < item->bytelen; skip += thislen)
            {
!               if (split_long_items && item->cells >= BALLOON_MIN_WIDTH)
!               {
!                   cells = item->indent * 2;
!                   for (p = item->start + skip;
!                           p < item->start + item->bytelen;
                                                            p += mb_ptr2len(p))
!                       if ((cells += ptr2cells(p)) > BALLOON_MIN_WIDTH)
!                           break;
!                   thislen = p - (item->start + skip);
!               }
!               else
!                   thislen = item->bytelen;
  
!               // put indent at the start
!               p = alloc(thislen + item->indent * 2 + 1);
!               if (p == NULL)
!               {
!                   for (line = 0; line <= height - 1; ++line)
!                       vim_free((*array)[line].pum_text);
!                   vim_free(*array);
!                   goto failed;
!               }
!               for (ind = 0; ind < item->indent * 2; ++ind)
!                   p[ind] = ' ';
  
!               // exclude spaces at the end of the string
!               for (copylen = thislen; copylen > 0; --copylen)
!                   if (item->start[skip + copylen - 1] != ' ')
!                       break;
  
!               vim_strncpy(p + ind, item->start + skip, copylen);
!               (*array)[line].pum_text = p;
!               item->indent = 0;  /* wrapped line has no indent */
!               ++line;
!           }
      }
      ga_clear(&ga);
      return height;
*** ../vim-8.1.2324/src/testdir/test_popup.vim  2019-08-23 22:31:33.217176868 
+0200
--- src/testdir/test_popup.vim  2019-11-21 13:21:41.461007028 +0100
***************
*** 795,800 ****
--- 795,806 ----
          \ '  next = 123}',
          \ ], balloon_split(
          \ 'struct = 0x234 {long = 2343 "\\"some long string that will be 
wrapped in two\\"", next = 123}'))
+   call assert_equal([
+         \ 'Some comment',
+         \ '',
+         \ 'typedef this that;',
+         \ ], balloon_split(
+         \ "Some comment\n\ntypedef this that;"))
  endfunc
  
  func Test_popup_position()
*** ../vim-8.1.2324/src/version.c       2019-11-21 12:12:07.921993053 +0100
--- src/version.c       2019-11-21 13:23:00.052837114 +0100
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     2325,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
95. Only communication in your household is through email.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            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/201911211233.xALCXNLc009110%40masaka.moolenaar.net.

Raspunde prin e-mail lui