mirror of
https://github.com/vim/vim.git
synced 2025-09-24 03:44:06 -04:00
updated for version 7.3.1287
Problem: Python SystemExit exception is not handled properly. Solution: Catch the exception and give an error. (Yasuhiro Matsumoto, Ken Takata)
This commit is contained in:
@@ -740,6 +740,11 @@ To work around such problems there are these options:
|
||||
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')
|
||||
|
@@ -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
|
||||
@@ -550,7 +552,8 @@ VimTryEnd(void)
|
||||
{
|
||||
--trylevel;
|
||||
/* Without this it stops processing all subsequent VimL commands and
|
||||
* generates strange error messages if I e.g. try calling Test() in a cycle */
|
||||
* generates strange error messages if I e.g. try calling Test() in a
|
||||
* cycle */
|
||||
did_emsg = FALSE;
|
||||
/* Keyboard interrupt should be preferred over anything else */
|
||||
if (got_int)
|
||||
@@ -4961,7 +4964,19 @@ run_cmd(const char *cmd, void *arg UNUSED
|
||||
#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 +4994,7 @@ run_do(const char *cmd, void *arg UNUSED
|
||||
char *code;
|
||||
int status;
|
||||
PyObject *pyfunc, *pymain;
|
||||
PyObject *run_ret;
|
||||
|
||||
if (u_save((linenr_T)RangeStart - 1, (linenr_T)RangeEnd + 1) != OK)
|
||||
{
|
||||
@@ -4990,7 +5006,23 @@ run_do(const char *cmd, void *arg UNUSED
|
||||
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 +5103,11 @@ run_eval(const char *cmd, typval_T *rettv
|
||||
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"));
|
||||
|
@@ -444,6 +444,7 @@ static PyObject *imp_PyExc_KeyError;
|
||||
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 @@ static PyObject *imp_PyExc_OverflowError;
|
||||
# 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 @@ get_exceptions(void)
|
||||
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 @@ get_exceptions(void)
|
||||
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);
|
||||
|
@@ -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_KeyError;
|
||||
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 @@ static PyObject *p3imp_PyExc_OverflowError;
|
||||
# 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 @@ get_py3_exceptions()
|
||||
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 @@ get_py3_exceptions()
|
||||
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);
|
||||
|
@@ -728,6 +728,8 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
1287,
|
||||
/**/
|
||||
1286,
|
||||
/**/
|
||||
|
Reference in New Issue
Block a user