Hi James, 2013/07/01 Mon 21:18:28 UTC+9 James McCoy wrote: > I think you mean "endorsed" in this sentence.
Thank you. -- Ken Takata -- -- 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 vim_dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.
diff --git a/runtime/doc/if_pyth.txt b/runtime/doc/if_pyth.txt --- a/runtime/doc/if_pyth.txt +++ b/runtime/doc/if_pyth.txt @@ -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 endorsed way to quit vim, use: > + :py vim.command("qall!") +< + *has-python* You can test what Python version is available with: > if has('python') diff --git a/src/if_py_both.h b/src/if_py_both.h --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -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,19 @@ #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); + } + else if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) + { + EMSG2(_(e_py_systemexit), "python"); + PyErr_Clear(); + } + else + PyErr_PrintEx(1); } static const char *code_hdr = "def " DOPY_FUNC "(line, linenr):\n "; @@ -4979,6 +4993,7 @@ char *code; int status; PyObject *pyfunc, *pymain; + PyObject *run_ret; if (u_save((linenr_T)RangeStart - 1, (linenr_T)RangeEnd + 1) != OK) { @@ -4990,7 +5005,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); + } + else if (PyErr_Occurred() && PyErr_ExceptionMatches(PyExc_SystemExit)) + { + PyMem_Free(code); + EMSG2(_(e_py_systemexit), "python"); + PyErr_Clear(); + return; + } + else + PyErr_PrintEx(1); + PyMem_Free(code); if (status) @@ -5071,6 +5102,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 --git a/src/if_python.c b/src/if_python.c --- a/src/if_python.c +++ b/src/if_python.c @@ -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 --git a/src/if_python3.c b/src/if_python3.c --- a/src/if_python3.c +++ b/src/if_python3.c @@ -126,7 +126,6 @@ # define PyErr_PrintEx py3_PyErr_PrintEx # define PyErr_NoMemory py3_PyErr_NoMemory # define PyErr_Occurred py3_PyErr_Occurred -# define PyErr_PrintEx py3_PyErr_PrintEx # define PyErr_SetNone py3_PyErr_SetNone # define PyErr_SetString py3_PyErr_SetString # define PyErr_SetObject py3_PyErr_SetObject @@ -403,6 +402,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 +413,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 +682,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 +692,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);