Patch 8.0.0698
Problem:    When a timer uses ":pyeval" or another Python command and it
            happens to be triggered while exiting a Crash may happen.
            (Ricky Zhou)
Solution:   Avoid running a Python command after python_end() was called.
            Do not trigger timers while exiting.  (closes #1824)
Files:      src/if_python.c, src/if_python3.c, src/ex_cmds2.c


*** ../vim-8.0.0697/src/if_python.c     2017-01-28 15:58:45.348197250 +0100
--- src/if_python.c     2017-07-07 14:38:58.636443739 +0200
***************
*** 779,784 ****
--- 779,785 ----
  
  static int initialised = 0;
  #define PYINITIALISED initialised
+ static int python_end_called = FALSE;
  
  #define DESTRUCTOR_FINISH(self) self->ob_type->tp_free((PyObject*)self);
  
***************
*** 878,883 ****
--- 879,885 ----
      if (recurse != 0)
        return;
  
+     python_end_called = TRUE;
      ++recurse;
  
  #ifdef DYNAMIC_PYTHON
***************
*** 1040,1045 ****
--- 1042,1049 ----
      }
      ++recursive;
  #endif
+     if (python_end_called)
+       return;
  
  #if defined(MACOS) && !defined(MACOS_X_UNIX)
      GetPort(&oldPort);
***************
*** 1568,1574 ****
            (rangeinitializer) init_range_eval,
            (runner) run_eval,
            (void *) rettv);
!     switch(rettv->v_type)
      {
        case VAR_DICT: ++rettv->vval.v_dict->dv_refcount; break;
        case VAR_LIST: ++rettv->vval.v_list->lv_refcount; break;
--- 1572,1578 ----
            (rangeinitializer) init_range_eval,
            (runner) run_eval,
            (void *) rettv);
!     switch (rettv->v_type)
      {
        case VAR_DICT: ++rettv->vval.v_dict->dv_refcount; break;
        case VAR_LIST: ++rettv->vval.v_list->lv_refcount; break;
*** ../vim-8.0.0697/src/if_python3.c    2017-01-28 15:58:45.348197250 +0100
--- src/if_python3.c    2017-07-07 14:46:21.049114965 +0200
***************
*** 733,740 ****
  #endif /* DYNAMIC_PYTHON3 */
  
  static int py3initialised = 0;
- 
  #define PYINITIALISED py3initialised
  
  #define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self)
  
--- 733,740 ----
  #endif /* DYNAMIC_PYTHON3 */
  
  static int py3initialised = 0;
  #define PYINITIALISED py3initialised
+ static int python_end_called = FALSE;
  
  #define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self)
  
***************
*** 817,822 ****
--- 817,823 ----
      if (recurse != 0)
        return;
  
+     python_end_called = TRUE;
      ++recurse;
  
  #ifdef DYNAMIC_PYTHON3
***************
*** 938,943 ****
--- 939,947 ----
      PyObject          *cmdbytes;
      PyGILState_STATE  pygilstate;
  
+     if (python_end_called)
+       goto theend;
+ 
  #if defined(MACOS) && !defined(MACOS_X_UNIX)
      GetPort(&oldPort);
      /* Check if the Python library is available */
*** ../vim-8.0.0697/src/ex_cmds2.c      2017-06-27 14:43:51.203020467 +0200
--- src/ex_cmds2.c      2017-07-07 14:45:32.265482186 +0200
***************
*** 1183,1188 ****
--- 1183,1189 ----
  /*
   * Call timers that are due.
   * Return the time in msec until the next timer is due.
+  * Returns -1 if there are no pending timers.
   */
      long
  check_due_timer(void)
***************
*** 1197,1202 ****
--- 1198,1207 ----
  # ifdef WIN3264
      LARGE_INTEGER   fr;
  
+     /* Don't run any timers while exiting. */
+     if (exiting)
+       return next_due;
+ 
      QueryPerformanceFrequency(&fr);
  # endif
      profile_start(&now);
*** ../vim-8.0.0697/src/version.c       2017-07-07 13:32:10.866905242 +0200
--- src/version.c       2017-07-07 14:44:58.941733011 +0200
***************
*** 766,767 ****
--- 766,769 ----
  {   /* Add new patch number below this line */
+ /**/
+     698,
  /**/

-- 
Would you care for a drink?   I mean, if it were, like,
disabled and you had to look after it?

 /// 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].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui