Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@mattn
Last active December 16, 2015 05:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattn/5385037 to your computer and use it in GitHub Desktop.
Save mattn/5385037 to your computer and use it in GitHub Desktop.
diff -r 22d6fe14e945 runtime/doc/if_pyth.txt
--- a/runtime/doc/if_pyth.txt Sun Jun 30 23:24:08 2013 +0200
+++ b/runtime/doc/if_pyth.txt Mon Jul 01 19:25:24 2013 +0900
@@ -740,6 +740,11 @@
3. You undefine PY_NO_RTLD_GLOBAL in auto/config.h after configuration. This
may crash Vim though.
+ *E880*
+Raising SystemExit exception in python isn't endosed way to quit vim, use: >
+ :py vim.command("qall!")
+<
+
*has-python*
You can test what Python version is available with: >
if has('python')
diff -r 22d6fe14e945 src/if_py_both.h
--- a/src/if_py_both.h Sun Jun 30 23:24:08 2013 +0200
+++ b/src/if_py_both.h Mon Jul 01 19:25:24 2013 +0900
@@ -13,6 +13,8 @@
* Common code for if_python.c and if_python3.c.
*/
+static char_u e_py_systemexit[] = "E880: Can't handle SystemExit of %s exception in vim";
+
#if PY_VERSION_HEX < 0x02050000
typedef int Py_ssize_t; /* Python 2.4 and earlier don't have this type. */
#endif
@@ -4961,7 +4963,17 @@
#endif
)
{
- PyRun_SimpleString((char *) cmd);
+ PyObject *run_ret;
+ run_ret = PyRun_String((char *) cmd, Py_file_input, globals, globals);
+ if (run_ret != NULL)
+ {
+ Py_DECREF(run_ret);
+ }
+ if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit))
+ {
+ EMSG2(_(e_py_systemexit), "python");
+ PyErr_Clear();
+ }
}
static const char *code_hdr = "def " DOPY_FUNC "(line, linenr):\n ";
@@ -4979,6 +4991,7 @@
char *code;
int status;
PyObject *pyfunc, *pymain;
+ PyObject *run_ret;
if (u_save((linenr_T)RangeStart - 1, (linenr_T)RangeEnd + 1) != OK)
{
@@ -4990,9 +5003,23 @@
code = PyMem_New(char, len + 1);
memcpy(code, code_hdr, code_hdr_len);
STRCPY(code + code_hdr_len, cmd);
- status = PyRun_SimpleString(code);
+ run_ret = PyRun_String(code, Py_file_input, globals, globals);
+ status = -1;
+ if (run_ret != NULL)
+ {
+ status = 0;
+ Py_DECREF(run_ret);
+ }
+
PyMem_Free(code);
+ if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit))
+ {
+ EMSG2(_(e_py_systemexit), "python");
+ PyErr_Clear();
+ return;
+ }
+
if (status)
{
EMSG(_("failed to run the code"));
@@ -5071,6 +5098,11 @@
run_ret = PyRun_String((char *) cmd, Py_eval_input, globals, globals);
if (run_ret == NULL)
{
+ if (PyErr_ExceptionMatches(PyExc_SystemExit))
+ {
+ EMSG2(_(e_py_systemexit), "python");
+ PyErr_Clear();
+ }
if (PyErr_Occurred() && !msg_silent)
PyErr_PrintEx(0);
EMSG(_("E858: Eval did not return a valid python object"));
diff -r 22d6fe14e945 src/if_python.c
--- a/src/if_python.c Sun Jun 30 23:24:08 2013 +0200
+++ b/src/if_python.c Mon Jul 01 19:25:24 2013 +0900
@@ -444,6 +444,7 @@
static PyObject *imp_PyExc_KeyboardInterrupt;
static PyObject *imp_PyExc_TypeError;
static PyObject *imp_PyExc_ValueError;
+static PyObject *imp_PyExc_SystemExit;
static PyObject *imp_PyExc_RuntimeError;
static PyObject *imp_PyExc_ImportError;
static PyObject *imp_PyExc_OverflowError;
@@ -454,6 +455,7 @@
# define PyExc_KeyboardInterrupt imp_PyExc_KeyboardInterrupt
# define PyExc_TypeError imp_PyExc_TypeError
# define PyExc_ValueError imp_PyExc_ValueError
+# define PyExc_SystemExit imp_PyExc_SystemExit
# define PyExc_RuntimeError imp_PyExc_RuntimeError
# define PyExc_ImportError imp_PyExc_ImportError
# define PyExc_OverflowError imp_PyExc_OverflowError
@@ -731,6 +733,7 @@
imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt");
imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
+ imp_PyExc_SystemExit = PyDict_GetItemString(exdict, "SystemExit");
imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError");
imp_PyExc_ImportError = PyDict_GetItemString(exdict, "ImportError");
imp_PyExc_OverflowError = PyDict_GetItemString(exdict, "OverflowError");
@@ -740,6 +743,7 @@
Py_XINCREF(imp_PyExc_KeyboardInterrupt);
Py_XINCREF(imp_PyExc_TypeError);
Py_XINCREF(imp_PyExc_ValueError);
+ Py_XINCREF(imp_PyExc_SystemExit);
Py_XINCREF(imp_PyExc_RuntimeError);
Py_XINCREF(imp_PyExc_ImportError);
Py_XINCREF(imp_PyExc_OverflowError);
diff -r 22d6fe14e945 src/if_python3.c
--- a/src/if_python3.c Sun Jun 30 23:24:08 2013 +0200
+++ b/src/if_python3.c Mon Jul 01 19:25:24 2013 +0900
@@ -403,6 +403,7 @@
static PyObject *p3imp_PyExc_KeyboardInterrupt;
static PyObject *p3imp_PyExc_TypeError;
static PyObject *p3imp_PyExc_ValueError;
+static PyObject *p3imp_PyExc_SystemExit;
static PyObject *p3imp_PyExc_RuntimeError;
static PyObject *p3imp_PyExc_ImportError;
static PyObject *p3imp_PyExc_OverflowError;
@@ -413,6 +414,7 @@
# define PyExc_KeyboardInterrupt p3imp_PyExc_KeyboardInterrupt
# define PyExc_TypeError p3imp_PyExc_TypeError
# define PyExc_ValueError p3imp_PyExc_ValueError
+# define PyExc_SystemExit p3imp_PyExc_SystemExit
# define PyExc_RuntimeError p3imp_PyExc_RuntimeError
# define PyExc_ImportError p3imp_PyExc_ImportError
# define PyExc_OverflowError p3imp_PyExc_OverflowError
@@ -681,6 +683,7 @@
p3imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt");
p3imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
p3imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
+ p3imp_PyExc_SystemExit = PyDict_GetItemString(exdict, "SystemExit");
p3imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError");
p3imp_PyExc_ImportError = PyDict_GetItemString(exdict, "ImportError");
p3imp_PyExc_OverflowError = PyDict_GetItemString(exdict, "OverflowError");
@@ -690,6 +693,7 @@
Py_XINCREF(p3imp_PyExc_KeyboardInterrupt);
Py_XINCREF(p3imp_PyExc_TypeError);
Py_XINCREF(p3imp_PyExc_ValueError);
+ Py_XINCREF(p3imp_PyExc_SystemExit);
Py_XINCREF(p3imp_PyExc_RuntimeError);
Py_XINCREF(p3imp_PyExc_ImportError);
Py_XINCREF(p3imp_PyExc_OverflowError);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment