To: vim_dev@googlegroups.com Subject: Patch 7.3.579 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.579 (after 7.3.569) Problem: Can't compile with Python 2.5. Solution: Use PyCObject when Capsules are not available. Files: src/if_py_both.h, src/if_python.c, src/if_python3.c *** ../vim-7.3.578/src/if_py_both.h 2012-06-29 16:19:46.000000000 +0200 --- src/if_py_both.h 2012-06-29 16:15:29.000000000 +0200 *************** *** 56,62 **** /* name, function, calling, documentation */ {"write", OutputWrite, 1, ""}, {"writelines", OutputWritelines, 1, ""}, ! {"flush", OutputFlush, 1, ""}, { NULL, NULL, 0, NULL} }; --- 56,62 ---- /* name, function, calling, documentation */ {"write", OutputWrite, 1, ""}, {"writelines", OutputWritelines, 1, ""}, ! {"flush", OutputFlush, 1, ""}, { NULL, NULL, 0, NULL} }; *************** *** 506,513 **** /* name, function, calling, documentation */ {"command", VimCommand, 1, "Execute a Vim ex-mode command" }, {"eval", VimEval, 1, "Evaluate an expression using Vim evaluator" }, ! {"bindeval", VimEvalPy, 1, "Like eval(), but returns objects attached to vim ones"}, ! {"strwidth", VimStrwidth, 1, "Screen string width, counts as having width 1"}, { NULL, NULL, 0, NULL } }; --- 506,513 ---- /* name, function, calling, documentation */ {"command", VimCommand, 1, "Execute a Vim ex-mode command" }, {"eval", VimEval, 1, "Evaluate an expression using Vim evaluator" }, ! {"bindeval", VimEvalPy, 1, "Like eval(), but returns objects attached to vim ones"}, ! {"strwidth", VimStrwidth, 1, "Screen string width, counts as having width 1"}, { NULL, NULL, 0, NULL } }; *************** *** 2432,2448 **** --- 2432,2463 ---- convert_dl(PyObject *obj, typval_T *tv, pytotvfunc py_to_tv, PyObject *lookupDict) { + # ifdef PY_USE_CAPSULE PyObject *capsule; + # else + PyCObject *cobject; + # endif char hexBuf[sizeof(void *) * 2 + 3]; sprintf(hexBuf, "%p", obj); + # ifdef PY_USE_CAPSULE capsule = PyDict_GetItemString(lookupDict, hexBuf); if (capsule == NULL) + # else + cobject = (PyCObject *)PyDict_GetItemString(lookupDict, hexBuf); + if (cobject == NULL) + # endif { + # ifdef PY_USE_CAPSULE capsule = PyCapsule_New(tv, NULL, NULL); PyDict_SetItemString(lookupDict, hexBuf, capsule); Py_DECREF(capsule); + # else + cobject = PyCObject_FromVoidPtr(tv, NULL); + PyDict_SetItemString(lookupDict, hexBuf, cobject); + Py_DECREF(cobject); + # endif if (py_to_tv(obj, tv, lookupDict) == -1) { tv->v_type = VAR_UNKNOWN; *************** *** 2458,2464 **** } else { ! typval_T *v = PyCapsule_GetPointer(capsule, NULL); copy_tv(v, tv); } return 0; --- 2473,2485 ---- } else { ! typval_T *v; ! ! # ifdef PY_USE_CAPSULE ! v = PyCapsule_GetPointer(capsule, NULL); ! # else ! v = PyCObject_AsVoidPtr(cobject); ! # endif copy_tv(v, tv); } return 0; *** ../vim-7.3.578/src/if_python.c 2012-06-29 12:54:32.000000000 +0200 --- src/if_python.c 2012-06-29 16:17:44.000000000 +0200 *************** *** 71,76 **** --- 71,80 ---- # define PySequenceMethods Py_ssize_t #endif + #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 + # define PY_USE_CAPSULE + #endif + #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000 # define PyInt Py_ssize_t # define PyInquiry lenfunc *************** *** 220,227 **** # define PyObject_Malloc dll_PyObject_Malloc # define PyObject_Free dll_PyObject_Free # endif ! # define PyCapsule_New dll_PyCapsule_New ! # define PyCapsule_GetPointer dll_PyCapsule_GetPointer /* * Pointers for dynamic link --- 224,236 ---- # define PyObject_Malloc dll_PyObject_Malloc # define PyObject_Free dll_PyObject_Free # endif ! # ifdef PY_USE_CAPSULE ! # define PyCapsule_New dll_PyCapsule_New ! # define PyCapsule_GetPointer dll_PyCapsule_GetPointer ! # else ! # define PyCObject_FromVoidPtr dll_PyCObject_FromVoidPtr ! # define PyCObject_AsVoidPtr dll_PyCObject_AsVoidPtr ! # endif /* * Pointers for dynamic link *************** *** 309,316 **** --- 318,330 ---- static void* (*dll_PyObject_Malloc)(size_t); static void (*dll_PyObject_Free)(void*); # endif + # ifdef PY_USE_CAPSULE static PyObject* (*dll_PyCapsule_New)(void *, char *, PyCapsule_Destructor); static void* (*dll_PyCapsule_GetPointer)(PyObject *, char *); + # else + static PyCObject* (*dll_PyCObject_FromVoidPtr)(void *cobj, void (*destr)(void *)); + static void* (*dll_PyCObject_AsVoidPtr)(PyCObject *); + # endif static HINSTANCE hinstPython = 0; /* Instance of python.dll */ *************** *** 403,409 **** {"PyType_Ready", (PYTHON_PROC*)&dll_PyType_Ready}, {"Py_BuildValue", (PYTHON_PROC*)&dll_Py_BuildValue}, {"Py_FindMethod", (PYTHON_PROC*)&dll_Py_FindMethod}, ! # if (PY_VERSION_HEX >= 0x02050000) && SIZEOF_SIZE_T != SIZEOF_INT {"Py_InitModule4_64", (PYTHON_PROC*)&dll_Py_InitModule4}, # else {"Py_InitModule4", (PYTHON_PROC*)&dll_Py_InitModule4}, --- 417,424 ---- {"PyType_Ready", (PYTHON_PROC*)&dll_PyType_Ready}, {"Py_BuildValue", (PYTHON_PROC*)&dll_Py_BuildValue}, {"Py_FindMethod", (PYTHON_PROC*)&dll_Py_FindMethod}, ! # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000 \ ! && SIZEOF_SIZE_T != SIZEOF_INT {"Py_InitModule4_64", (PYTHON_PROC*)&dll_Py_InitModule4}, # else {"Py_InitModule4", (PYTHON_PROC*)&dll_Py_InitModule4}, *************** *** 424,431 **** --- 439,451 ---- {"PyObject_Malloc", (PYTHON_PROC*)&dll_PyObject_Malloc}, {"PyObject_Free", (PYTHON_PROC*)&dll_PyObject_Free}, # endif + # ifdef PY_USE_CAPSULE {"PyCapsule_New", (PYTHON_PROC*)&dll_PyCapsule_New}, {"PyCapsule_GetPointer", (PYTHON_PROC*)&dll_PyCapsule_GetPointer}, + # else + {"PyCObject_FromVoidPtr", (PYTHON_PROC*)&dll_PyCObject_FromVoidPtr}, + {"PyCObject_AsVoidPtr", (PYTHON_PROC*)&dll_PyCObject_AsVoidPtr}, + # endif {"", NULL}, }; *** ../vim-7.3.578/src/if_python3.c 2012-06-29 12:54:32.000000000 +0200 --- src/if_python3.c 2012-06-29 16:16:54.000000000 +0200 *************** *** 75,80 **** --- 75,83 ---- # define CODEC_ERROR_HANDLER NULL #endif + /* Python 3 does not support CObjects, always use Capsules */ + #define PY_USE_CAPSULE + #define PyInt Py_ssize_t #define PyString_Check(obj) PyUnicode_Check(obj) #define PyString_AsBytes(obj) PyUnicode_AsEncodedString(obj, (char *)ENC_OPT, CODEC_ERROR_HANDLER) *** ../vim-7.3.578/src/version.c 2012-06-29 16:19:46.000000000 +0200 --- src/version.c 2012-06-29 16:21:25.000000000 +0200 *************** *** 716,717 **** --- 716,719 ---- { /* Add new patch number below this line */ + /**/ + 579, /**/ -- hundred-and-one symptoms of being an internet addict: 78. You find yourself dialing IP numbers on the phone. /// 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 ///