summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <bram@vim.org>2012-06-29 16:28:28 +0200
committerBram Moolenaar <bram@vim.org>2012-06-29 16:28:28 +0200
commit7ede2904f0986b59bc845e597ef16baeb75779bd (patch)
treee6766058008e169dc7911386467a28cce7549382
parent222fafab18ecac3476071a0409096e9fcbf69675 (diff)
downloadvim-7.3.579.tar.gz
updated for version 7.3.579v7.3.579v7-3-579
Problem: Can't compile with Python 2.5. Solution: Use PyCObject when Capsules are not available.
-rw-r--r--src/if_py_both.h29
-rw-r--r--src/if_python.c26
-rw-r--r--src/if_python3.c3
-rw-r--r--src/version.c2
4 files changed, 53 insertions, 7 deletions
diff --git a/src/if_py_both.h b/src/if_py_both.h
index d828358e..8229458d 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -56,7 +56,7 @@ static struct PyMethodDef OutputMethods[] = {
/* name, function, calling, documentation */
{"write", OutputWrite, 1, ""},
{"writelines", OutputWritelines, 1, ""},
- {"flush", OutputFlush, 1, ""},
+ {"flush", OutputFlush, 1, ""},
{ NULL, NULL, 0, NULL}
};
@@ -506,8 +506,8 @@ static struct PyMethodDef VimMethods[] = {
/* 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 <Tab> as having width 1"},
+ {"bindeval", VimEvalPy, 1, "Like eval(), but returns objects attached to vim ones"},
+ {"strwidth", VimStrwidth, 1, "Screen string width, counts <Tab> as having width 1"},
{ NULL, NULL, 0, NULL }
};
@@ -2432,17 +2432,32 @@ typedef int (*pytotvfunc)(PyObject *, typval_T *, PyObject *);
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,7 +2473,13 @@ convert_dl(PyObject *obj, typval_T *tv,
}
else
{
- typval_T *v = PyCapsule_GetPointer(capsule, NULL);
+ typval_T *v;
+
+# ifdef PY_USE_CAPSULE
+ v = PyCapsule_GetPointer(capsule, NULL);
+# else
+ v = PyCObject_AsVoidPtr(cobject);
+# endif
copy_tv(v, tv);
}
return 0;
diff --git a/src/if_python.c b/src/if_python.c
index 23d58d12..0667b5ea 100644
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -71,6 +71,10 @@ struct PyMethodDef { Py_ssize_t a; };
# 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,8 +224,13 @@ struct PyMethodDef { Py_ssize_t a; };
# 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
+# 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,8 +318,13 @@ static int (*dll_PyType_IsSubtype)(PyTypeObject *, PyTypeObject *);
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,7 +417,8 @@ static struct
{"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
+# 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,8 +439,13 @@ static struct
{"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},
};
diff --git a/src/if_python3.c b/src/if_python3.c
index c4e122c2..a62971e8 100644
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -75,6 +75,9 @@ static void init_structs(void);
# 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)
diff --git a/src/version.c b/src/version.c
index 9ab5188f..074ce3e5 100644
--- a/src/version.c
+++ b/src/version.c
@@ -715,6 +715,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 579,
+/**/
578,
/**/
577,