Patch 8.2.1664
Problem:    Memory leak when using :mkview with a terminal buffer.
Solution:   Don't use a hastab for :mkview. (Rob Pilling, closes #6935)
Files:      src/session.c, src/terminal.c, src/testdir/test_mksession.vim


*** ../vim-8.2.1663/src/session.c       2020-09-11 20:36:32.462574370 +0200
--- src/session.c       2020-09-11 22:07:11.270214850 +0200
***************
*** 303,316 ****
  put_view(
      FILE      *fd,
      win_T     *wp,
!     int               add_edit,       // add ":edit" command to view
!     unsigned  *flagp,         // vop_flags or ssop_flags
!     int               current_arg_idx // current argument index of the 
window, use
!                               // -1 if unknown
! #ifdef FEAT_TERMINAL
!     , hashtab_T *terminal_bufs
! #endif
!     )
  {
      win_T     *save_curwin;
      int               f;
--- 303,314 ----
  put_view(
      FILE      *fd,
      win_T     *wp,
!     int               add_edit,            // add ":edit" command to view
!     unsigned  *flagp,              // vop_flags or ssop_flags
!     int               current_arg_idx,     // current argument index of the 
window,
!                                    // use -1 if unknown
!     hashtab_T *terminal_bufs UNUSED) // already encountered terminal buffers,
!                                    // can be NULL
  {
      win_T     *save_curwin;
      int               f;
***************
*** 825,833 ****
        {
            if (!ses_do_win(wp))
                continue;
!           if (put_view(fd, wp, wp != edited_win, &ssop_flags, cur_arg_idx
  #ifdef FEAT_TERMINAL
!                                                        , &terminal_bufs
  #endif
                 ) == FAIL)
                goto fail;
--- 823,833 ----
        {
            if (!ses_do_win(wp))
                continue;
!           if (put_view(fd, wp, wp != edited_win, &ssop_flags, cur_arg_idx,
  #ifdef FEAT_TERMINAL
!                                                        &terminal_bufs
! #else
!                                                        NULL
  #endif
                 ) == FAIL)
                goto fail;
***************
*** 1102,1112 ****
      char_u    *viewFile = NULL;
      unsigned  *flagp;
  #endif
- #ifdef FEAT_TERMINAL
-     hashtab_T terminal_bufs;
- 
-     hash_init(&terminal_bufs);
- #endif
  
      if (eap->cmdidx == CMD_mksession || eap->cmdidx == CMD_mkview)
      {
--- 1102,1107 ----
***************
*** 1263,1273 ****
            }
            else
            {
!               failed |= (put_view(fd, curwin, !using_vdir, flagp, -1
! #ifdef FEAT_TERMINAL
!                                                              , &terminal_bufs
! #endif
!                           ) == FAIL);
            }
            if (put_line(fd, "let &so = s:so_save | let &siso = s:siso_save")
                                                                      == FAIL)
--- 1258,1265 ----
            }
            else
            {
!               failed |= (put_view(fd, curwin, !using_vdir, flagp, -1, NULL)
!                                                                     == FAIL);
            }
            if (put_line(fd, "let &so = s:so_save | let &siso = s:siso_save")
                                                                      == FAIL)
*** ../vim-8.2.1663/src/terminal.c      2020-09-11 20:36:32.462574370 +0200
--- src/terminal.c      2020-09-11 22:04:17.474783303 +0200
***************
*** 940,946 ****
      const int bufnr = wp->w_buffer->b_fnum;
      term_T    *term = wp->w_buffer->b_term;
  
!     if (wp->w_buffer->b_nwindows > 1)
      {
        // There are multiple views into this terminal buffer. We don't want to
        // create the terminal multiple times. If it's the first time, create,
--- 940,946 ----
      const int bufnr = wp->w_buffer->b_fnum;
      term_T    *term = wp->w_buffer->b_term;
  
!     if (terminal_bufs != NULL && wp->w_buffer->b_nwindows > 1)
      {
        // There are multiple views into this terminal buffer. We don't want to
        // create the terminal multiple times. If it's the first time, create,
***************
*** 978,984 ****
      if (fprintf(fd, "let s:term_buf_%d = bufnr()", bufnr) < 0)
        return FAIL;
  
!     if (wp->w_buffer->b_nwindows > 1)
      {
        char *hash_key = alloc(NUMBUFLEN);
  
--- 978,984 ----
      if (fprintf(fd, "let s:term_buf_%d = bufnr()", bufnr) < 0)
        return FAIL;
  
!     if (terminal_bufs != NULL && wp->w_buffer->b_nwindows > 1)
      {
        char *hash_key = alloc(NUMBUFLEN);
  
*** ../vim-8.2.1663/src/testdir/test_mksession.vim      2020-09-11 
20:36:32.466574355 +0200
--- src/testdir/test_mksession.vim      2020-09-11 21:59:05.867703897 +0200
***************
*** 351,359 ****
    call delete('Xtest_mks.out')
  endfunc
  
- if has('terminal')
- 
  func Test_mksession_terminal_shell()
    CheckFeature quickfix
  
    terminal
--- 351,358 ----
    call delete('Xtest_mks.out')
  endfunc
  
  func Test_mksession_terminal_shell()
+   CheckFeature terminal
    CheckFeature quickfix
  
    terminal
***************
*** 374,379 ****
--- 373,380 ----
  endfunc
  
  func Test_mksession_terminal_no_restore_cmdarg()
+   CheckFeature terminal
+ 
    terminal ++norestore
    mksession! Xtest_mks.out
    let lines = readfile('Xtest_mks.out')
***************
*** 389,394 ****
--- 390,397 ----
  endfunc
  
  func Test_mksession_terminal_no_restore_funcarg()
+   CheckFeature terminal
+ 
    call term_start(&shell, {'norestore': 1})
    mksession! Xtest_mks.out
    let lines = readfile('Xtest_mks.out')
***************
*** 404,409 ****
--- 407,414 ----
  endfunc
  
  func Test_mksession_terminal_no_restore_func()
+   CheckFeature terminal
+ 
    terminal
    call term_setrestore(bufnr('%'), 'NONE')
    mksession! Xtest_mks.out
***************
*** 420,425 ****
--- 425,432 ----
  endfunc
  
  func Test_mksession_terminal_no_ssop()
+   CheckFeature terminal
+ 
    terminal
    set sessionoptions-=terminal
    mksession! Xtest_mks.out
***************
*** 437,442 ****
--- 444,450 ----
  endfunc
  
  func Test_mksession_terminal_restore_other()
+   CheckFeature terminal
    CheckFeature quickfix
  
    terminal
***************
*** 456,461 ****
--- 464,471 ----
  endfunc
  
  func Test_mksession_terminal_shared_windows()
+   CheckFeature terminal
+ 
    terminal
    let term_buf = bufnr()
    new
***************
*** 481,487 ****
    call delete('Xtest_mks.out')
  endfunc
  
! endif " has('terminal')
  
  " Test :mkview with a file argument.
  func Test_mkview_file()
--- 491,508 ----
    call delete('Xtest_mks.out')
  endfunc
  
! func Test_mkview_terminal_windows()
!   CheckFeature terminal
! 
!   " create two window on the same terminal to check this is handled OK
!   terminal
!   let term_buf = bufnr()
!   exe 'sbuf ' .. term_buf
!   mkview! Xtestview
! 
!   call StopShellInTerminal(term_buf)
!   call delete('Xtestview')
! endfunc
  
  " Test :mkview with a file argument.
  func Test_mkview_file()
*** ../vim-8.2.1663/src/version.c       2020-09-11 20:51:22.835620641 +0200
--- src/version.c       2020-09-11 22:04:07.830811948 +0200
***************
*** 752,753 ****
--- 752,755 ----
  {   /* Add new patch number below this line */
+ /**/
+     1664,
  /**/

-- 
Q: What kind of stuff do you do?
A: I collect hobbies.

 /// 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/202009112011.08BKB3Ee962425%40masaka.moolenaar.net.

Raspunde prin e-mail lui