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);

Raspunde prin e-mail lui