# HG changeset patch # User Bram Moolenaar # Date 1369167836 -7200 # Node ID ce94a870b59bbaad92399eb782edc33a855e0b93 # Parent c5406fa9565871a9eae851da9d1e38a7f45f38db updated for version 7.3.1003 Problem: Python interface does not compile with Python 2.2 Solution: Fix thread issues and True/False. (ZyX) 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 @@ -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; diff --git a/src/if_python.c b/src/if_python.c --- 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); diff --git a/src/if_python3.c b/src/if_python3.c --- 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 */ diff --git a/src/testdir/test86.in b/src/testdir/test86.in --- 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 '' 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: diff --git a/src/testdir/test86.ok b/src/testdir/test86.ok --- a/src/testdir/test86.ok +++ b/src/testdir/test86.ok @@ -333,7 +333,7 @@ Number of tabs: 4 Current tab pages: (1): 1 windows, current is Windows: - (1): displays buffer ; cursor is at (990, 0) + (1): displays buffer ; cursor is at (27, 0) (2): 1 windows, current is Windows: (1): displays buffer ; cursor is at (1, 0) diff --git a/src/testdir/test87.in b/src/testdir/test87.in --- 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 '' 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: diff --git a/src/testdir/test87.ok b/src/testdir/test87.ok --- a/src/testdir/test87.ok +++ b/src/testdir/test87.ok @@ -322,7 +322,7 @@ Number of tabs: 4 Current tab pages: (1): 1 windows, current is Windows: - (1): displays buffer ; cursor is at (966, 0) + (1): displays buffer ; cursor is at (27, 0) (2): 1 windows, current is Windows: (1): displays buffer ; cursor is at (1, 0) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1003, +/**/ 1002, /**/ 1001,