diff options
author | Charles Harris <charlesr.harris@gmail.com> | 2010-02-25 05:20:51 +0000 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2010-02-25 05:20:51 +0000 |
commit | f3580687a3f3752a8a8bebbcbe5b594055beb299 (patch) | |
tree | 116f28c4d47f23a0cfaec37050bfe93cf42ecf44 /numpy | |
parent | 9596a895dd01c27b9984fe8ff20e151eda41b9b8 (diff) | |
download | numpy-f3580687a3f3752a8a8bebbcbe5b594055beb299.tar.gz |
ENH: Add support for PyCapsule.
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/f2py/cb_rules.py | 4 | ||||
-rw-r--r-- | numpy/f2py/cfuncs.py | 2 | ||||
-rw-r--r-- | numpy/f2py/rules.py | 6 | ||||
-rw-r--r-- | numpy/f2py/src/fortranobject.c | 55 | ||||
-rw-r--r-- | numpy/f2py/src/fortranobject.h | 16 |
5 files changed, 76 insertions, 7 deletions
diff --git a/numpy/f2py/cb_rules.py b/numpy/f2py/cb_rules.py index ce297ed79..6e5502137 100644 --- a/numpy/f2py/cb_rules.py +++ b/numpy/f2py/cb_rules.py @@ -60,9 +60,9 @@ f2py_cb_start_clock(); \t\tPyErr_SetString(#modulename#_error,\"cb: Callback #argname# not defined (as an argument or module #modulename# attribute).\\n\"); \t\tgoto capi_fail; \t} -\tif (PyCObject_Check(#name#_capi)) { +\tif (F2PyCapsule_Check(#name#_capi)) { \t#name#_typedef #name#_cptr; -\t#name#_cptr = PyCObject_AsVoidPtr(#name#_capi); +\t#name#_cptr = F2PyCapsule_AsVoidPtr(#name#_capi); \t#returncptr#(*#name#_cptr)(#optargs_nm##args_nm##strarglens_nm#); \t#return# \t} diff --git a/numpy/f2py/cfuncs.py b/numpy/f2py/cfuncs.py index 5c9de1701..ec448680d 100644 --- a/numpy/f2py/cfuncs.py +++ b/numpy/f2py/cfuncs.py @@ -999,7 +999,7 @@ static int create_cb_arglist(PyObject* fun,PyTupleObject* xa,const int maxnofarg \t\t\t\ttot += PyTuple_Size((PyObject *)xa); \t\t\ttmp_fun = fun; \t\t} -\t\telse if (PyCObject_Check(fun)) { +\t\telse if (F2PyCapsule_Check(fun)) { \t\t\ttot = maxnofargs; \t\t\tif (xa != NULL) \t\t\t\text = PyTuple_Size((PyObject *)xa); diff --git a/numpy/f2py/rules.py b/numpy/f2py/rules.py index ef4b9cc34..e4fb61d81 100644 --- a/numpy/f2py/rules.py +++ b/numpy/f2py/rules.py @@ -392,7 +392,7 @@ rout_rules=[ { extern #ctype# #F_FUNC#(#name_lower#,#NAME#)(void); PyObject* o = PyDict_GetItemString(d,"#name#"); - PyObject_SetAttrString(o,"_cpointer", PyCObject_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL)); + PyObject_SetAttrString(o,"_cpointer", F2PyCapsule_FromVoidPtr((void*)#F_FUNC#(#name_lower#,#NAME#),NULL)); } '''}, 'need':{l_not(l_or(ismoduleroutine,isdummyroutine)):['F_WRAPPEDFUNC','F_FUNC']}, @@ -686,8 +686,8 @@ arg_rules=[ }, { 'frompyobj':[{l_not(isintent_callback):"""\ -if(PyCObject_Check(#varname#_capi)) { - #varname#_cptr = PyCObject_AsVoidPtr(#varname#_capi); +if(F2PyCapsule_Check(#varname#_capi)) { + #varname#_cptr = F2PyCapsule_AsVoidPtr(#varname#_capi); } else { #varname#_cptr = #cbname#; } diff --git a/numpy/f2py/src/fortranobject.c b/numpy/f2py/src/fortranobject.c index 66e02ff89..3f8177808 100644 --- a/numpy/f2py/src/fortranobject.c +++ b/numpy/f2py/src/fortranobject.c @@ -855,6 +855,61 @@ int copy_ND_array(const PyArrayObject *arr, PyArrayObject *out) return PyArray_CopyInto(out, (PyArrayObject *)arr); } +/*******************************************/ +/* Compatibility functions for Python 3.1 */ +/*******************************************/ + +#if PY_VERSION_HEX >= 0X03010000 + +PyObject * +F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *)) +{ + PyObject *ret = PyCapsule_New(ptr, NULL, dtor); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} + +void * +F2PyCapsule_AsVoidPtr(PyObject *obj) +{ + void *ret = PyCapsule_GetPointer(obj, NULL); + if (ret == NULL) { + PyErr_Clear(); + } + return ret; +} + +int +F2PyCapsule_Check(PyObject *ptr) +{ + return PyCapsule_CheckExact(ptr); +} + +#else + +PyObject * +F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(void *)) +{ + return PyCObject_FromVoidPtr(ptr, dtor); +} + +void * +F2PyCapsule_AsVoidPtr(PyObject *ptr) +{ + return PyCObject_AsVoidPtr(ptr); +} + +int +F2PyCapsule_Check(PyObject *ptr) +{ + return PyCObject_Check(ptr); +} + +#endif + + #ifdef __cplusplus } #endif diff --git a/numpy/f2py/src/fortranobject.h b/numpy/f2py/src/fortranobject.h index d08c65808..696f79c94 100644 --- a/numpy/f2py/src/fortranobject.h +++ b/numpy/f2py/src/fortranobject.h @@ -84,7 +84,7 @@ typedef struct { typedef struct { PyObject_HEAD int len; /* Number of attributes */ - FortranDataDef *defs; /* An array of FortranDataDef's */ + FortranDataDef *defs; /* An array of FortranDataDef's */ PyObject *dict; /* Fortran object attribute dictionary */ } PyFortranObject; @@ -96,6 +96,20 @@ typedef struct { extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init); extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs); +#if PY_VERSION_HEX >= 0X03010000 + +PyObject * F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *)); +void * F2PyCapsule_AsVoidPtr(PyObject *obj); +int F2PyCapsule_Check(PyObject *ptr); + +#else + +PyObject * F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(void *)); +void * F2PyCapsule_AsVoidPtr(PyObject *ptr); +int F2PyCapsule_Check(PyObject *ptr); + +#endif + #define ISCONTIGUOUS(m) ((m)->flags & NPY_CONTIGUOUS) #define F2PY_INTENT_IN 1 #define F2PY_INTENT_INOUT 2 |