Mercurial > vim
changeset 4511:ce94a870b59b v7.3.1003
updated for version 7.3.1003
Problem: Python interface does not compile with Python 2.2
Solution: Fix thread issues and True/False. (ZyX)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Tue, 21 May 2013 22:23:56 +0200 |
parents | c5406fa95658 |
children | 1faad5feb5f3 |
files | src/if_py_both.h src/if_python.c src/if_python3.c src/testdir/test86.in src/testdir/test86.ok src/testdir/test87.in src/testdir/test87.ok src/version.c |
diffstat | 8 files changed, 75 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -31,7 +31,11 @@ typedef int Py_ssize_t; /* Python 2.4 a #define INVALID_TABPAGE_VALUE ((tabpage_T *)(-1)) typedef void (*rangeinitializer)(void *); -typedef void (*runner)(const char *, void *, PyGILState_STATE *); +typedef void (*runner)(const char *, void * +#ifdef PY_CAN_RECURSE + , PyGILState_STATE * +#endif + ); static int ConvertFromPyObject(PyObject *, typval_T *); static int _ConvertFromPyObject(PyObject *, typval_T *, PyObject *); @@ -3489,7 +3493,11 @@ init_range_eval(typval_T *rettv UNUSED) } static void -run_cmd(const char *cmd, void *arg UNUSED, PyGILState_STATE *pygilstate UNUSED) +run_cmd(const char *cmd, void *arg UNUSED +#ifdef PY_CAN_RECURSE + , PyGILState_STATE *pygilstate UNUSED +#endif + ) { PyRun_SimpleString((char *) cmd); } @@ -3498,7 +3506,11 @@ static const char *code_hdr = "def " DOP static int code_hdr_len = 30; static void -run_do(const char *cmd, void *arg UNUSED, PyGILState_STATE *pygilstate) +run_do(const char *cmd, void *arg UNUSED +#ifdef PY_CAN_RECURSE + , PyGILState_STATE *pygilstate +#endif + ) { PyInt lnum; size_t len; @@ -3528,13 +3540,17 @@ run_do(const char *cmd, void *arg UNUSED status = 0; pymain = PyImport_AddModule("__main__"); pyfunc = PyObject_GetAttrString(pymain, DOPY_FUNC); +#ifdef PY_CAN_RECURSE PyGILState_Release(*pygilstate); +#endif for (lnum = RangeStart; lnum <= RangeEnd; ++lnum) { PyObject *line, *linenr, *ret; +#ifdef PY_CAN_RECURSE *pygilstate = PyGILState_Ensure(); +#endif if (!(line = GetBufferLine(curbuf, lnum))) goto err; if (!(linenr = PyInt_FromLong((long) lnum))) @@ -3554,17 +3570,23 @@ run_do(const char *cmd, void *arg UNUSED Py_XDECREF(ret); PythonIO_Flush(); +#ifdef PY_CAN_RECURSE PyGILState_Release(*pygilstate); +#endif } goto out; err: +#ifdef PY_CAN_RECURSE *pygilstate = PyGILState_Ensure(); +#endif PyErr_PrintEx(0); PythonIO_Flush(); status = 1; out: +#ifdef PY_CAN_RECURSE if (!status) *pygilstate = PyGILState_Ensure(); +#endif Py_DECREF(pyfunc); PyObject_SetAttrString(pymain, DOPY_FUNC, NULL); if (status) @@ -3574,7 +3596,11 @@ out: } static void -run_eval(const char *cmd, typval_T *rettv, PyGILState_STATE *pygilstate UNUSED) +run_eval(const char *cmd, typval_T *rettv +#ifdef PY_CAN_RECURSE + , PyGILState_STATE *pygilstate UNUSED +#endif + ) { PyObject *r;
--- a/src/if_python.c +++ b/src/if_python.c @@ -641,7 +641,7 @@ static int initialised = 0; #define DICTKEY_UNREF #define DICTKEY_DECL -#define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self); +#define DESTRUCTOR_FINISH(self) self->ob_type->tp_free((PyObject*)self); #define WIN_PYTHON_REF(win) win->w_python_ref #define BUF_PYTHON_REF(buf) buf->b_python_ref @@ -656,6 +656,15 @@ static PyObject *DictionaryGetattr(PyObj static PyObject *ListGetattr(PyObject *, char *); static PyObject *FunctionGetattr(PyObject *, char *); +#ifndef Py_VISIT +# define Py_VISIT(obj) visit(obj, arg) +#endif +#ifndef Py_CLEAR +# define Py_CLEAR(obj) \ + Py_XDECREF(obj); \ + obj = NULL; +#endif + /* * Include the code shared with if_python3.c */ @@ -881,7 +890,11 @@ DoPyCommand(const char *cmd, rangeinitia Python_RestoreThread(); /* enter python */ #endif - run((char *) cmd, arg, &pygilstate); + run((char *) cmd, arg +#ifdef PY_CAN_RECURSE + , &pygilstate +#endif + ); #ifdef PY_CAN_RECURSE PyGILState_Release(pygilstate);
--- a/src/if_python3.c +++ b/src/if_python3.c @@ -693,6 +693,8 @@ static PyObject *FunctionGetattro(PyObje static struct PyModuleDef vimmodule; +#define PY_CAN_RECURSE + /* * Include the code shared with if_python.c */
--- a/src/testdir/test86.in +++ b/src/testdir/test86.in @@ -518,6 +518,10 @@ EOF :edit c :buffer # py << EOF +try: + from __builtin__ import next +except ImportError: + next = lambda o: o.next() # Check GCing iterator that was not fully exhausted i = iter(vim.buffers) cb.append('i:' + str(next(i))) @@ -577,15 +581,22 @@ py << EOF cb.append('Number of tabs: ' + str(len(vim.tabpages))) cb.append('Current tab pages:') def W(w): - if '(unknown)' in repr(w): + if repr(w).find('(unknown)') != -1: return '<window object (unknown)>' else: return repr(w) + +def Cursor(w, start=len(cb)): + if w.buffer is cb: + return repr((start - w.cursor[0], w.cursor[1])) + else: + return repr(w.cursor) + for t in vim.tabpages: cb.append(' ' + repr(t) + '(' + str(t.number) + ')' + ': ' + str(len(t.windows)) + ' windows, current is ' + W(t.window)) cb.append(' Windows:') for w in t.windows: - cb.append(' ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + repr(w.cursor)) + cb.append(' ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + Cursor(w)) # Other values depend on the size of the terminal, so they are checked partly: for attr in ('height', 'row', 'width', 'col'): try:
--- a/src/testdir/test86.ok +++ b/src/testdir/test86.ok @@ -333,7 +333,7 @@ Number of tabs: 4 Current tab pages: <tabpage 0>(1): 1 windows, current is <window object (unknown)> Windows: - <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (990, 0) + <window object (unknown)>(1): displays buffer <buffer test86.in>; cursor is at (27, 0) <tabpage 1>(2): 1 windows, current is <window object (unknown)> Windows: <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)
--- a/src/testdir/test87.in +++ b/src/testdir/test87.in @@ -561,18 +561,26 @@ EOF :vnew b.2 :vnew c.2 py3 << EOF +cb.append('Number of tabs: ' + str(len(vim.tabpages))) +cb.append('Current tab pages:') + def W(w): if '(unknown)' in repr(w): return '<window object (unknown)>' else: return repr(w) -cb.append('Number of tabs: ' + str(len(vim.tabpages))) -cb.append('Current tab pages:') + +def Cursor(w, start=len(cb)): + if w.buffer is cb: + return repr((start - w.cursor[0], w.cursor[1])) + else: + return repr(w.cursor) + for t in vim.tabpages: cb.append(' ' + repr(t) + '(' + str(t.number) + ')' + ': ' + str(len(t.windows)) + ' windows, current is ' + W(t.window)) cb.append(' Windows:') for w in t.windows: - cb.append(' ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + repr(w.cursor)) + cb.append(' ' + W(w) + '(' + str(w.number) + ')' + ': displays buffer ' + repr(w.buffer) + '; cursor is at ' + Cursor(w)) # Other values depend on the size of the terminal, so they are checked partly: for attr in ('height', 'row', 'width', 'col'): try:
--- a/src/testdir/test87.ok +++ b/src/testdir/test87.ok @@ -322,7 +322,7 @@ Number of tabs: 4 Current tab pages: <tabpage 0>(1): 1 windows, current is <window object (unknown)> Windows: - <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (966, 0) + <window object (unknown)>(1): displays buffer <buffer test87.in>; cursor is at (27, 0) <tabpage 1>(2): 1 windows, current is <window object (unknown)> Windows: <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0)