To: vim_dev@googlegroups.com Subject: Patch 7.3.1003 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.1003 Problem: Python interface does not compile with Python 2.2 Solution: Fix thread issues and True/False. (ZyX) Files: src/if_py_both.h, src/if_python3.c, src/if_python.c, src/testdir/test86.in, src/testdir/test86.ok, src/testdir/test87.in, src/testdir/test87.ok *** ../vim-7.3.1002/src/if_py_both.h 2013-05-21 22:13:36.000000000 +0200 --- src/if_py_both.h 2013-05-21 22:16:58.000000000 +0200 *************** *** 31,37 **** #define INVALID_TABPAGE_VALUE ((tabpage_T *)(-1)) typedef void (*rangeinitializer)(void *); ! typedef void (*runner)(const char *, void *, PyGILState_STATE *); static int ConvertFromPyObject(PyObject *, typval_T *); static int _ConvertFromPyObject(PyObject *, typval_T *, PyObject *); --- 31,41 ---- #define INVALID_TABPAGE_VALUE ((tabpage_T *)(-1)) typedef void (*rangeinitializer)(void *); ! 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,3495 **** } static void ! run_cmd(const char *cmd, void *arg UNUSED, PyGILState_STATE *pygilstate UNUSED) { PyRun_SimpleString((char *) cmd); } --- 3493,3503 ---- } static void ! run_cmd(const char *cmd, void *arg UNUSED ! #ifdef PY_CAN_RECURSE ! , PyGILState_STATE *pygilstate UNUSED ! #endif ! ) { PyRun_SimpleString((char *) cmd); } *************** *** 3498,3504 **** static int code_hdr_len = 30; static void ! run_do(const char *cmd, void *arg UNUSED, PyGILState_STATE *pygilstate) { PyInt lnum; size_t len; --- 3506,3516 ---- static int code_hdr_len = 30; static void ! run_do(const char *cmd, void *arg UNUSED ! #ifdef PY_CAN_RECURSE ! , PyGILState_STATE *pygilstate ! #endif ! ) { PyInt lnum; size_t len; *************** *** 3528,3540 **** --- 3540,3556 ---- 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,3570 **** --- 3570,3592 ---- 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,3580 **** } static void ! run_eval(const char *cmd, typval_T *rettv, PyGILState_STATE *pygilstate UNUSED) { PyObject *r; --- 3596,3606 ---- } static void ! run_eval(const char *cmd, typval_T *rettv ! #ifdef PY_CAN_RECURSE ! , PyGILState_STATE *pygilstate UNUSED ! #endif ! ) { PyObject *r; *** ../vim-7.3.1002/src/if_python3.c 2013-05-21 20:51:55.000000000 +0200 --- src/if_python3.c 2013-05-21 22:16:58.000000000 +0200 *************** *** 693,698 **** --- 693,700 ---- static struct PyModuleDef vimmodule; + #define PY_CAN_RECURSE + /* * Include the code shared with if_python.c */ *** ../vim-7.3.1002/src/if_python.c 2013-05-21 20:51:55.000000000 +0200 --- src/if_python.c 2013-05-21 22:16:58.000000000 +0200 *************** *** 641,647 **** #define DICTKEY_UNREF #define DICTKEY_DECL ! #define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self); #define WIN_PYTHON_REF(win) win->w_python_ref #define BUF_PYTHON_REF(buf) buf->b_python_ref --- 641,647 ---- #define DICTKEY_UNREF #define DICTKEY_DECL ! #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,661 **** --- 656,670 ---- 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,887 **** Python_RestoreThread(); /* enter python */ #endif ! run((char *) cmd, arg, &pygilstate); #ifdef PY_CAN_RECURSE PyGILState_Release(pygilstate); --- 890,900 ---- Python_RestoreThread(); /* enter python */ #endif ! run((char *) cmd, arg ! #ifdef PY_CAN_RECURSE ! , &pygilstate ! #endif ! ); #ifdef PY_CAN_RECURSE PyGILState_Release(pygilstate); *** ../vim-7.3.1002/src/testdir/test86.in 2013-05-21 20:40:35.000000000 +0200 --- src/testdir/test86.in 2013-05-21 22:16:58.000000000 +0200 *************** *** 518,523 **** --- 518,527 ---- :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,591 **** 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) 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)) # Other values depend on the size of the terminal, so they are checked partly: for attr in ('height', 'row', 'width', 'col'): try: --- 581,602 ---- cb.append('Number of tabs: ' + str(len(vim.tabpages))) cb.append('Current tab pages:') def W(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 ' + Cursor(w)) # Other values depend on the size of the terminal, so they are checked partly: for attr in ('height', 'row', 'width', 'col'): try: *** ../vim-7.3.1002/src/testdir/test86.ok 2013-05-21 20:40:35.000000000 +0200 --- src/testdir/test86.ok 2013-05-21 22:18:02.000000000 +0200 *************** *** 333,339 **** Current tab pages: (1): 1 windows, current is Windows: ! (1): displays buffer ; cursor is at (990, 0) (2): 1 windows, current is Windows: (1): displays buffer ; cursor is at (1, 0) --- 333,339 ---- Current tab pages: (1): 1 windows, current is Windows: ! (1): displays buffer ; cursor is at (27, 0) (2): 1 windows, current is Windows: (1): displays buffer ; cursor is at (1, 0) *** ../vim-7.3.1002/src/testdir/test87.in 2013-05-21 20:40:35.000000000 +0200 --- src/testdir/test87.in 2013-05-21 22:16:58.000000000 +0200 *************** *** 561,578 **** :vnew b.2 :vnew c.2 py3 << EOF 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:') 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)) # Other values depend on the size of the terminal, so they are checked partly: for attr in ('height', 'row', 'width', 'col'): try: --- 561,586 ---- :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) ! ! 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 ' + Cursor(w)) # Other values depend on the size of the terminal, so they are checked partly: for attr in ('height', 'row', 'width', 'col'): try: *** ../vim-7.3.1002/src/testdir/test87.ok 2013-05-21 20:40:35.000000000 +0200 --- src/testdir/test87.ok 2013-05-21 22:18:31.000000000 +0200 *************** *** 322,328 **** Current tab pages: (1): 1 windows, current is Windows: ! (1): displays buffer ; cursor is at (966, 0) (2): 1 windows, current is Windows: (1): displays buffer ; cursor is at (1, 0) --- 322,328 ---- Current tab pages: (1): 1 windows, current is Windows: ! (1): displays buffer ; cursor is at (27, 0) (2): 1 windows, current is Windows: (1): displays buffer ; cursor is at (1, 0) *** ../vim-7.3.1002/src/version.c 2013-05-21 22:13:36.000000000 +0200 --- src/version.c 2013-05-21 22:19:01.000000000 +0200 *************** *** 730,731 **** --- 730,733 ---- { /* Add new patch number below this line */ + /**/ + 1003, /**/ -- ./configure Checking whether build environment is sane ... build environment is grinning and holding a spatula. Guess not. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///