суббота, 18 августа 2012 г., 0:24:14 UTC+4 пользователь Bram Moolenaar написал:
>
> I do not see your name. Patches without a full name are not accepted,
>
> for copyright reasons.
>
Fixed.
суббота, 18 августа 2012 г., 0:24:14 UTC+4 пользователь Bram Moolenaar написал:
>
> With this patch, what does :py print "hello" result in? Is there an
>
> extra line with whatever "print" returns?
>
Actually after my first patch "print" doesn't print at all. Sorry for
inconvenience, I should have tested this first.
Please look at the second version of patch (pyrepl1.diff) which fixes that and
also shows some diagnostics in case of python exception. There will be no extra
new line after "print" call.
--
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
diff -r 536aa8b0c934 src/if_python.c
--- a/src/if_python.c Wed Aug 15 17:43:31 2012 +0200
+++ b/src/if_python.c Sat Aug 18 04:06:44 2012 +0400
@@ -148,6 +148,7 @@
# define PyErr_Clear dll_PyErr_Clear
# define PyErr_NoMemory dll_PyErr_NoMemory
# define PyErr_Occurred dll_PyErr_Occurred
+# define PyErr_Print dll_PyErr_Print
# define PyErr_SetNone dll_PyErr_SetNone
# define PyErr_SetString dll_PyErr_SetString
# define PyEval_InitThreads dll_PyEval_InitThreads
@@ -234,7 +235,6 @@
# define PyCObject_FromVoidPtr dll_PyCObject_FromVoidPtr
# define PyCObject_AsVoidPtr dll_PyCObject_AsVoidPtr
# endif
-
/*
* Pointers for dynamic link
*/
@@ -247,6 +247,7 @@
static void(*dll_PyErr_Clear)(void);
static PyObject*(*dll_PyErr_NoMemory)(void);
static PyObject*(*dll_PyErr_Occurred)(void);
+static void(*dll_PyErr_Print)(void);
static void(*dll_PyErr_SetNone)(PyObject *);
static void(*dll_PyErr_SetString)(PyObject *, const char *);
static void(*dll_PyEval_InitThreads)(void);
@@ -330,7 +331,6 @@
static PyObject* (*dll_PyCObject_FromVoidPtr)(void *cobj, void (*destr)(void *));
static void* (*dll_PyCObject_AsVoidPtr)(PyObject *);
# endif
-
static HINSTANCE hinstPython = 0; /* Instance of python.dll */
/* Imported exception objects */
@@ -365,6 +365,7 @@
{"PyErr_Clear", (PYTHON_PROC*)&dll_PyErr_Clear},
{"PyErr_NoMemory", (PYTHON_PROC*)&dll_PyErr_NoMemory},
{"PyErr_Occurred", (PYTHON_PROC*)&dll_PyErr_Occurred},
+ {"PyErr_Print", (PYTHON_PROC*)&dll_PyErr_Print},
{"PyErr_SetNone", (PYTHON_PROC*)&dll_PyErr_SetNone},
{"PyErr_SetString", (PYTHON_PROC*)&dll_PyErr_SetString},
{"PyEval_InitThreads", (PYTHON_PROC*)&dll_PyEval_InitThreads},
@@ -819,24 +820,30 @@
Python_RestoreThread(); /* enter python */
- if (rettv == NULL)
- PyRun_SimpleString((char *)(cmd));
+ PyObject *r;
+
+ r = PyRun_String((char *)(cmd), Py_single_input, globals, globals);
+
+ if (r == NULL)
+ {
+ if (PyErr_Occurred())
+ PyErr_Print();
+
+ if (rettv != NULL)
+ EMSG(_("E858: Eval did not return a valid python object"));
+ }
else
{
- PyObject *r;
-
- r = PyRun_String((char *)(cmd), Py_eval_input, globals, globals);
- if (r == NULL)
- EMSG(_("E858: Eval did not return a valid python object"));
- else
+ if (rettv != NULL)
{
if (ConvertFromPyObject(r, rettv) == -1)
EMSG(_("E859: Failed to convert returned python object to vim value"));
- Py_DECREF(r);
}
- PyErr_Clear();
+
+ Py_DECREF(r);
}
+ PyErr_Clear();
Python_SaveThread(); /* leave python */
#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
@@ -1578,7 +1585,10 @@
PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList);
if (PyErr_Occurred())
+ {
+ PyErr_Print();
return -1;
+ }
return 0;
}
diff -r 536aa8b0c934 src/if_python3.c
--- a/src/if_python3.c Wed Aug 15 17:43:31 2012 +0200
+++ b/src/if_python3.c Sat Aug 18 04:06:44 2012 +0400
@@ -120,6 +120,7 @@
# define PyErr_Occurred py3_PyErr_Occurred
# define PyErr_SetNone py3_PyErr_SetNone
# define PyErr_SetString py3_PyErr_SetString
+# define PyErr_Print py3_PyErr_Print
# define PyEval_InitThreads py3_PyEval_InitThreads
# define PyEval_RestoreThread py3_PyEval_RestoreThread
# define PyEval_SaveThread py3_PyEval_SaveThread
@@ -232,6 +233,7 @@
static PyObject* (*py3_PyErr_NoMemory)(void);
static void (*py3_Py_Finalize)(void);
static void (*py3_PyErr_SetString)(PyObject *, const char *);
+static void (*py3_PyErr_Print)(void);
static int (*py3_PyRun_SimpleString)(char *);
static PyObject* (*py3_PyRun_String)(char *, int, PyObject *, PyObject *);
static PyObject* (*py3_PyList_GetItem)(PyObject *, Py_ssize_t);
@@ -343,6 +345,7 @@
{"PyErr_NoMemory", (PYTHON_PROC*)&py3_PyErr_NoMemory},
{"Py_Finalize", (PYTHON_PROC*)&py3_Py_Finalize},
{"PyErr_SetString", (PYTHON_PROC*)&py3_PyErr_SetString},
+ {"PyErr_Print", (PYTHON_PROC*)&py3_PyErr_Print},
{"PyRun_SimpleString", (PYTHON_PROC*)&py3_PyRun_SimpleString},
{"PyRun_String", (PYTHON_PROC*)&py3_PyRun_String},
{"PyList_GetItem", (PYTHON_PROC*)&py3_PyList_GetItem},
@@ -782,24 +785,31 @@
(char *)ENC_OPT, CODEC_ERROR_HANDLER);
cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", CODEC_ERROR_HANDLER);
Py_XDECREF(cmdstr);
- if (rettv == NULL)
- PyRun_SimpleString(PyBytes_AsString(cmdbytes));
+
+ PyObject *r;
+
+ r = PyRun_String(PyBytes_AsString(cmdbytes), Py_single_input, globals, globals);
+
+ if (r == NULL)
+ {
+ if (PyErr_Occurred())
+ PyErr_Print();
+
+ if (rettv != NULL)
+ EMSG(_("E860: Eval did not return a valid python 3 object"));
+ }
else
{
- PyObject *r;
-
- r = PyRun_String(PyBytes_AsString(cmdbytes), Py_eval_input,
- globals, globals);
- if (r == NULL)
- EMSG(_("E860: Eval did not return a valid python 3 object"));
- else
+ if (rettv != NULL)
{
if (ConvertFromPyObject(r, rettv) == -1)
EMSG(_("E861: Failed to convert returned python 3 object to vim value"));
- Py_DECREF(r);
}
- PyErr_Clear();
+
+ Py_DECREF(r);
}
+
+ PyErr_Clear();
Py_XDECREF(cmdbytes);
PyGILState_Release(pygilstate);
@@ -1760,7 +1770,10 @@
PyModule_AddObject(mod, "windows", (PyObject *)(void *)&TheWindowList);
if (PyErr_Occurred())
+ {
+ PyErr_Print();
return NULL;
+ }
return mod;
}