| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.948 |
| 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.948 |
| Problem: Cannot build with Python 2.2 |
| Solution: Make Python interface work with Python 2.2 |
| Make 2.2 the first supported version. (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.ok, src/configure.in, src/auto/configure |
| |
| |
| |
| |
| |
| *** 564,569 **** |
| --- 564,570 ---- |
| return (PyObject *)(self); |
| } |
| |
| + #if 0 /* unused */ |
| static void |
| IterDestructor(PyObject *self) |
| { |
| |
| *** 573,578 **** |
| --- 574,580 ---- |
| |
| DESTRUCTOR_FINISH(self); |
| } |
| + #endif |
| |
| static PyObject * |
| IterNext(PyObject *self) |
| |
| *** 696,708 **** |
| } |
| else |
| { |
| ! if (!PyBool_Check(val)) |
| ! { |
| ! PyErr_SetString(PyExc_TypeError, _("Only boolean objects are allowed")); |
| ! return -1; |
| ! } |
| ! |
| ! if (val == Py_True) |
| this->dict->dv_lock = VAR_LOCKED; |
| else |
| this->dict->dv_lock = 0; |
| --- 698,704 ---- |
| } |
| else |
| { |
| ! if (PyObject_IsTrue(val)) |
| this->dict->dv_lock = VAR_LOCKED; |
| else |
| this->dict->dv_lock = 0; |
| |
| *** 1202,1214 **** |
| } |
| else |
| { |
| ! if (!PyBool_Check(val)) |
| ! { |
| ! PyErr_SetString(PyExc_TypeError, _("Only boolean objects are allowed")); |
| ! return -1; |
| ! } |
| ! |
| ! if (val == Py_True) |
| this->list->lv_lock = VAR_LOCKED; |
| else |
| this->list->lv_lock = 0; |
| --- 1198,1204 ---- |
| } |
| else |
| { |
| ! if (PyObject_IsTrue(val)) |
| this->list->lv_lock = VAR_LOCKED; |
| else |
| this->list->lv_lock = 0; |
| |
| *** 1484,1497 **** |
| |
| if (flags & SOPT_BOOL) |
| { |
| ! if (!PyBool_Check(valObject)) |
| ! { |
| ! PyErr_SetString(PyExc_ValueError, "Object must be boolean"); |
| ! return -1; |
| ! } |
| ! |
| ! r = set_option_value_for(key, (valObject == Py_True), NULL, opt_flags, |
| ! this->opt_type, this->from); |
| } |
| else if (flags & SOPT_NUM) |
| { |
| --- 1474,1481 ---- |
| |
| if (flags & SOPT_BOOL) |
| { |
| ! r = set_option_value_for(key, PyObject_IsTrue(valObject), NULL, |
| ! opt_flags, this->opt_type, this->from); |
| } |
| else if (flags & SOPT_NUM) |
| { |
| |
| |
| |
| *** 156,161 **** |
| --- 156,162 ---- |
| # define PyMapping_Items py3_PyMapping_Items |
| # define PyIter_Next py3_PyIter_Next |
| # define PyObject_GetIter py3_PyObject_GetIter |
| + # define PyObject_IsTrue py3_PyObject_IsTrue |
| # define PyModule_GetDict py3_PyModule_GetDict |
| #undef PyRun_SimpleString |
| # define PyRun_SimpleString py3_PyRun_SimpleString |
| |
| *** 264,269 **** |
| --- 265,271 ---- |
| static PyObject* (*py3_PyDict_New)(void); |
| static PyObject* (*py3_PyIter_Next)(PyObject *); |
| static PyObject* (*py3_PyObject_GetIter)(PyObject *); |
| + static int (*py3_PyObject_IsTrue)(PyObject *); |
| static PyObject* (*py3_Py_BuildValue)(char *, ...); |
| static int (*py3_PyType_Ready)(PyTypeObject *type); |
| static int (*py3_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item); |
| |
| *** 392,397 **** |
| --- 394,400 ---- |
| {"PyMapping_Items", (PYTHON_PROC*)&py3_PyMapping_Items}, |
| {"PyIter_Next", (PYTHON_PROC*)&py3_PyIter_Next}, |
| {"PyObject_GetIter", (PYTHON_PROC*)&py3_PyObject_GetIter}, |
| + {"PyObject_IsTrue", (PYTHON_PROC*)&py3_PyObject_IsTrue}, |
| {"PyLong_FromLong", (PYTHON_PROC*)&py3_PyLong_FromLong}, |
| {"PyDict_New", (PYTHON_PROC*)&py3_PyDict_New}, |
| {"PyType_Ready", (PYTHON_PROC*)&py3_PyType_Ready}, |
| |
| |
| |
| *** 229,234 **** |
| --- 229,235 ---- |
| # define _Py_TrueStruct (*dll__Py_TrueStruct) |
| # define PyObject_Init dll__PyObject_Init |
| # define PyObject_GetIter dll_PyObject_GetIter |
| + # define PyObject_IsTrue dll_PyObject_IsTrue |
| # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000 |
| # define PyType_IsSubtype dll_PyType_IsSubtype |
| # endif |
| |
| *** 324,329 **** |
| --- 325,331 ---- |
| static PyObject*(*dll__PyObject_New)(PyTypeObject *, PyObject *); |
| static PyObject*(*dll__PyObject_Init)(PyObject *, PyTypeObject *); |
| static PyObject* (*dll_PyObject_GetIter)(PyObject *); |
| + static int (*dll_PyObject_IsTrue)(PyObject *); |
| # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 |
| static iternextfunc dll__PyObject_NextNotImplemented; |
| # endif |
| |
| *** 459,464 **** |
| --- 461,467 ---- |
| {"_PyObject_New", (PYTHON_PROC*)&dll__PyObject_New}, |
| {"PyObject_Init", (PYTHON_PROC*)&dll__PyObject_Init}, |
| {"PyObject_GetIter", (PYTHON_PROC*)&dll_PyObject_GetIter}, |
| + {"PyObject_IsTrue", (PYTHON_PROC*)&dll_PyObject_IsTrue}, |
| # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 |
| {"_PyObject_NextNotImplemented", (PYTHON_PROC*)&dll__PyObject_NextNotImplemented}, |
| # endif |
| |
| *** 787,793 **** |
| * so the following does both: unlock GIL and save thread state in TLS |
| * without deleting thread state |
| */ |
| ! PyEval_SaveThread(); |
| |
| initialised = 1; |
| } |
| --- 790,799 ---- |
| * so the following does both: unlock GIL and save thread state in TLS |
| * without deleting thread state |
| */ |
| ! #ifndef PY_CAN_RECURSE |
| ! saved_python_thread = |
| ! #endif |
| ! PyEval_SaveThread(); |
| |
| initialised = 1; |
| } |
| |
| |
| |
| *** 183,220 **** |
| : $put ='[0.0, 0.0]' |
| :endif |
| :let messages=[] |
| ! :py <<EOF |
| d=vim.bindeval('{}') |
| m=vim.bindeval('messages') |
| ! try: |
| ! d['abc'] |
| ! except Exception as e: |
| ! m.extend([e.__class__.__name__]) |
| ! |
| ! try: |
| ! d['abc']="\0" |
| ! except Exception as e: |
| ! m.extend([e.__class__.__name__]) |
| ! |
| ! try: |
| ! d['abc']=vim |
| ! except Exception as e: |
| ! m.extend([e.__class__.__name__]) |
| ! |
| ! try: |
| ! d['']=1 |
| ! except Exception as e: |
| ! m.extend([e.__class__.__name__]) |
| ! |
| ! try: |
| ! d['a\0b']=1 |
| ! except Exception as e: |
| ! m.extend([e.__class__.__name__]) |
| ! |
| ! try: |
| ! d[b'a\0b']=1 |
| ! except Exception as e: |
| ! m.extend([e.__class__.__name__]) |
| EOF |
| :$put =messages |
| :unlet messages |
| --- 183,203 ---- |
| : $put ='[0.0, 0.0]' |
| :endif |
| :let messages=[] |
| ! py <<EOF |
| d=vim.bindeval('{}') |
| m=vim.bindeval('messages') |
| ! def em(expr, g=globals(), l=locals()): |
| ! try: |
| ! exec(expr, g, l) |
| ! except: |
| ! m.extend([sys.exc_type.__name__]) |
| ! |
| ! em('d["abc"]') |
| ! em('d["abc"]="\\0"') |
| ! em('d["abc"]=vim') |
| ! em('d[""]=1') |
| ! em('d["a\\0b"]=1') |
| ! em('d[u"a\\0b"]=1') |
| EOF |
| :$put =messages |
| :unlet messages |
| |
| *** 394,407 **** |
| def e(s, g=globals(), l=locals()): |
| try: |
| exec(s, g, l) |
| ! except Exception as e: |
| ! vim.command('throw ' + repr(e.__class__.__name__)) |
| |
| def ev(s, g=globals(), l=locals()): |
| try: |
| return eval(s, g, l) |
| ! except Exception as e: |
| ! vim.command('throw ' + repr(e.__class__.__name__)) |
| return 0 |
| EOF |
| :function E(s) |
| --- 377,390 ---- |
| def e(s, g=globals(), l=locals()): |
| try: |
| exec(s, g, l) |
| ! except: |
| ! vim.command('throw ' + repr(sys.exc_type.__name__)) |
| |
| def ev(s, g=globals(), l=locals()): |
| try: |
| return eval(s, g, l) |
| ! except: |
| ! vim.command('throw ' + repr(sys.exc_type.__name__)) |
| return 0 |
| EOF |
| :function E(s) |
| |
| |
| |
| *** 82,88 **** |
| bar |
| >>> paste |
| p/gopts1: False |
| - inv: 2! ValueError |
| p/wopts1! KeyError |
| inv: 2! KeyError |
| wopts1! KeyError |
| --- 82,87 ---- |
| |
| *** 224,230 **** |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: False |
| - inv: 2! ValueError |
| G: 0 |
| W: 1:0 2:1 3:0 4:1 |
| B: 1:0 2:1 3:0 4:1 |
| --- 223,228 ---- |
| |
| *** 280,286 **** |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: False |
| - inv: 2! ValueError |
| G: 0 |
| W: 1:0 2:1 3:0 4:1 |
| B: 1:0 2:1 3:0 4:1 |
| --- 278,283 ---- |
| |
| |
| |
| *** 71,77 **** |
| bar |
| >>> paste |
| p/gopts1: False |
| - inv: 2! ValueError |
| p/wopts1! KeyError |
| inv: 2! KeyError |
| wopts1! KeyError |
| --- 71,76 ---- |
| |
| *** 213,219 **** |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: False |
| - inv: 2! ValueError |
| G: 0 |
| W: 1:0 2:1 3:0 4:1 |
| B: 1:0 2:1 3:0 4:1 |
| --- 212,217 ---- |
| |
| *** 269,275 **** |
| wopts2! KeyError |
| wopts3! KeyError |
| p/bopts1: False |
| - inv: 2! ValueError |
| G: 0 |
| W: 1:0 2:1 3:0 4:1 |
| B: 1:0 2:1 3:0 4:1 |
| --- 267,272 ---- |
| |
| |
| |
| *** 863,872 **** |
| ${vi_cv_path_python} -c 'import sys; print sys.version[:3]'` |
| ]]) |
| |
| ! dnl -- it must be at least version 1.4 |
| ! AC_MSG_CHECKING(Python is 1.4 or better) |
| if ${vi_cv_path_python} -c \ |
| ! "import sys; sys.exit(${vi_cv_var_python_version} < 1.4)" |
| then |
| AC_MSG_RESULT(yep) |
| |
| --- 863,872 ---- |
| ${vi_cv_path_python} -c 'import sys; print sys.version[:3]'` |
| ]]) |
| |
| ! dnl -- it must be at least version 2.2 |
| ! AC_MSG_CHECKING(Python is 2.2 or better) |
| if ${vi_cv_path_python} -c \ |
| ! "import sys; sys.exit(${vi_cv_var_python_version} < 2.2)" |
| then |
| AC_MSG_RESULT(yep) |
| |
| |
| |
| |
| *** 5289,5298 **** |
| { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vi_cv_var_python_version" >&5 |
| $as_echo "$vi_cv_var_python_version" >&6; } |
| |
| ! { $as_echo "$as_me:${as_lineno-$LINENO}: checking Python is 1.4 or better" >&5 |
| ! $as_echo_n "checking Python is 1.4 or better... " >&6; } |
| if ${vi_cv_path_python} -c \ |
| ! "import sys; sys.exit(${vi_cv_var_python_version} < 1.4)" |
| then |
| { $as_echo "$as_me:${as_lineno-$LINENO}: result: yep" >&5 |
| $as_echo "yep" >&6; } |
| --- 5289,5298 ---- |
| { $as_echo "$as_me:${as_lineno-$LINENO}: result: $vi_cv_var_python_version" >&5 |
| $as_echo "$vi_cv_var_python_version" >&6; } |
| |
| ! { $as_echo "$as_me:${as_lineno-$LINENO}: checking Python is 2.2 or better" >&5 |
| ! $as_echo_n "checking Python is 2.2 or better... " >&6; } |
| if ${vi_cv_path_python} -c \ |
| ! "import sys; sys.exit(${vi_cv_var_python_version} < 2.2)" |
| then |
| { $as_echo "$as_me:${as_lineno-$LINENO}: result: yep" >&5 |
| $as_echo "yep" >&6; } |
| |
| |
| |
| *** 730,731 **** |
| --- 730,733 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 948, |
| /**/ |
| |
| -- |
| MARTHA'S WAY: Don't throw out all that leftover wine. Freeze into ice cubes |
| for future use in casseroles and sauces. |
| MY WAY: What leftover wine? |
| |
| /// 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 /// |