]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.956 v7.3.956
authorBram Moolenaar <Bram@vim.org>
Wed, 15 May 2013 15:49:05 +0000 (17:49 +0200)
committerBram Moolenaar <Bram@vim.org>
Wed, 15 May 2013 15:49:05 +0000 (17:49 +0200)
Problem:    Python vim.bindeval() causes SIGABRT.
Solution:   Make pygilstate a local variable. (Yukihiro Nakadaira)

src/if_py_both.h
src/if_python.c
src/if_python3.c
src/version.c

index 4905bed68d0493f5abdd889c4102933d8d762d38..2fef1e42699a23520e3490de85645e9ad9765680 100644 (file)
@@ -1298,7 +1298,14 @@ FunctionCall(PyObject *self, PyObject *argsObject, PyObject *kwargs)
        }
     }
 
+    Py_BEGIN_ALLOW_THREADS
+    Python_Lock_Vim();
+
     error = func_call(name, &args, selfdict, &rettv);
+
+    Python_Release_Vim();
+    Py_END_ALLOW_THREADS
+
     if (error != OK)
     {
        result = NULL;
index 1c192454956c0f02c0ac0ac25fa5933377304f6d..134e7f932691b4d82fdcdc2cc1cda7bc3093978c 100644 (file)
@@ -676,11 +676,8 @@ static int SetBufferLineList(buf_T *, PyInt, PyInt, PyObject *, PyInt *);
 typedef PyObject PyThreadState;
 #endif
 
-#ifdef PY_CAN_RECURSE
-static PyGILState_STATE pygilstate = PyGILState_UNLOCKED;
-#else
+#ifndef PY_CAN_RECURSE
 static PyThreadState *saved_python_thread = NULL;
-#endif
 
 /*
  * Suspend a thread of the Python interpreter, other threads are allowed to
@@ -689,11 +686,7 @@ static PyThreadState *saved_python_thread = NULL;
     static void
 Python_SaveThread(void)
 {
-#ifdef PY_CAN_RECURSE
-    PyGILState_Release(pygilstate);
-#else
     saved_python_thread = PyEval_SaveThread();
-#endif
 }
 
 /*
@@ -703,13 +696,10 @@ Python_SaveThread(void)
     static void
 Python_RestoreThread(void)
 {
-#ifdef PY_CAN_RECURSE
-    pygilstate = PyGILState_Ensure();
-#else
     PyEval_RestoreThread(saved_python_thread);
     saved_python_thread = NULL;
-#endif
 }
+#endif
 
     void
 python_end()
@@ -725,14 +715,22 @@ python_end()
 #ifdef DYNAMIC_PYTHON
     if (hinstPython && Py_IsInitialized())
     {
+# ifdef PY_CAN_RECURSE
+       PyGILState_Ensure();
+# else
        Python_RestoreThread();     /* enter python */
+# endif
        Py_Finalize();
     }
     end_dynamic_python();
 #else
     if (Py_IsInitialized())
     {
+# ifdef PY_CAN_RECURSE
+       PyGILState_Ensure();
+# else
        Python_RestoreThread();     /* enter python */
+# endif
        Py_Finalize();
     }
 #endif
@@ -837,6 +835,9 @@ DoPythonCommand(exarg_T *eap, const char *cmd, typval_T *rettv)
 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
     char               *saved_locale;
 #endif
+#ifdef PY_CAN_RECURSE
+    PyGILState_STATE   pygilstate;
+#endif
 
 #ifndef PY_CAN_RECURSE
     if (recursive)
@@ -881,7 +882,11 @@ DoPythonCommand(exarg_T *eap, const char *cmd, typval_T *rettv)
     }
 #endif
 
+#ifdef PY_CAN_RECURSE
+    pygilstate = PyGILState_Ensure();
+#else
     Python_RestoreThread();        /* enter python */
+#endif
 
     if (rettv == NULL)
        PyRun_SimpleString((char *)(cmd));
@@ -905,7 +910,11 @@ DoPythonCommand(exarg_T *eap, const char *cmd, typval_T *rettv)
        PyErr_Clear();
     }
 
+#ifdef PY_CAN_RECURSE
+    PyGILState_Release(pygilstate);
+#else
     Python_SaveThread();           /* leave python */
+#endif
 
 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
     if (saved_locale != NULL)
index 2f98a046273dc0f527daae9cffaa17194fb39ce2..daf517f77abbb4b2ed2376728d1e8006e8053214 100644 (file)
@@ -699,8 +699,6 @@ static PyObject *Py3Init_vim(void);
  * 1. Python interpreter main program.
  */
 
-static PyGILState_STATE pygilstate = PyGILState_UNLOCKED;
-
     void
 python3_end()
 {
@@ -718,7 +716,7 @@ python3_end()
     if (Py_IsInitialized())
     {
        // acquire lock before finalizing
-       pygilstate = PyGILState_Ensure();
+       PyGILState_Ensure();
 
        Py_Finalize();
     }
@@ -826,6 +824,7 @@ DoPy3Command(exarg_T *eap, const char *cmd, typval_T *rettv)
 #endif
     PyObject           *cmdstr;
     PyObject           *cmdbytes;
+    PyGILState_STATE   pygilstate;
 
 #if defined(MACOS) && !defined(MACOS_X_UNIX)
     GetPort(&oldPort);
index b99117badf01e971ecb300787866825245c0abcb..c7cb1fa4c8d37c78984fd8d2aa920e2479b03d5b 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    956,
 /**/
     955,
 /**/