Skip to content

Commit

Permalink
updated for version 7.3.579
Browse files Browse the repository at this point in the history
Problem:    Can't compile with Python 2.5.
Solution:   Use PyCObject when Capsules are not available.
  • Loading branch information
brammool committed Jun 29, 2012
1 parent 7709e76 commit 365041a
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 7 deletions.
29 changes: 25 additions & 4 deletions src/if_py_both.h
Original file line number Diff line number Diff line change
Expand Up @@ -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}
};

Expand Down Expand Up @@ -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 }
};

Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand Down
26 changes: 23 additions & 3 deletions src/if_python.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 */

Expand Down Expand Up @@ -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},
Expand All @@ -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},
};

Expand Down
3 changes: 3 additions & 0 deletions src/if_python3.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -714,6 +714,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
579,
/**/
578,
/**/
Expand Down

0 comments on commit 365041a

Please sign in to comment.