| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.1003 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| 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 |
| |
| |
| |
| |
| |
| *** 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; |
| |
| |
| |
| |
| *** 693,698 **** |
| --- 693,700 ---- |
| |
| static struct PyModuleDef vimmodule; |
| |
| + #define PY_CAN_RECURSE |
| + |
| /* |
| * Include the code shared with if_python.c |
| */ |
| |
| |
| |
| *** 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); |
| |
| |
| |
| *** 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 '<window object (unknown)>' |
| 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 '<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 ' + Cursor(w)) |
| # Other values depend on the size of the terminal, so they are checked partly: |
| for attr in ('height', 'row', 'width', 'col'): |
| try: |
| |
| |
| |
| *** 333,339 **** |
| 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) |
| <tabpage 1>(2): 1 windows, current is <window object (unknown)> |
| Windows: |
| <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0) |
| --- 333,339 ---- |
| 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 (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) |
| |
| |
| |
| *** 561,578 **** |
| :vnew b.2 |
| :vnew c.2 |
| py3 << EOF |
| 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:') |
| 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 '<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 ' + Cursor(w)) |
| # Other values depend on the size of the terminal, so they are checked partly: |
| for attr in ('height', 'row', 'width', 'col'): |
| try: |
| |
| |
| |
| *** 322,328 **** |
| 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) |
| <tabpage 1>(2): 1 windows, current is <window object (unknown)> |
| Windows: |
| <window object (unknown)>(1): displays buffer <buffer 0>; cursor is at (1, 0) |
| --- 322,328 ---- |
| 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 (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) |
| |
| |
| |
| *** 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 /// |