From 4c1ae336a15e4f701848fac12a521ba67bf784d3 Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Sat, 6 Mar 2010 23:59:08 +0000 Subject: 3K: f2py: port much of f2py C code to Py3 --- numpy/f2py/src/fortranobject.c | 63 ++++++++++++++++++++++++++++++++++++++++-- numpy/f2py/src/fortranobject.h | 32 +++++++++++++++++++-- 2 files changed, 89 insertions(+), 6 deletions(-) (limited to 'numpy/f2py/src') diff --git a/numpy/f2py/src/fortranobject.c b/numpy/f2py/src/fortranobject.c index d08b43c6b..1cd3d3f31 100644 --- a/numpy/f2py/src/fortranobject.c +++ b/numpy/f2py/src/fortranobject.c @@ -92,9 +92,12 @@ fortran_dealloc(PyFortranObject *fp) { } +#if PY_VERSION_HEX >= 0x03000000 +#else static PyMethodDef fortran_methods[] = { {NULL, NULL} /* sentinel */ }; +#endif static PyObject * @@ -167,7 +170,11 @@ fortran_doc (FortranDataDef def) { strlen(p),size); goto fail; } +#if PY_VERSION_HEX >= 0x03000000 + s = PyUnicode_FromString(p); +#else s = PyString_FromString(p); +#endif fail: free(p); return s; @@ -221,20 +228,41 @@ fortran_getattr(PyFortranObject *fp, char *name) { return fp->dict; } if (strcmp(name,"__doc__")==0) { +#if PY_VERSION_HEX >= 0x03000000 + PyObject *s = PyUnicode_FromString(""), *s2, *s3; + for (i=0;ilen;i++) { + s2 = fortran_doc(fp->defs[i]); + s3 = PyUnicode_Concat(s, s2); + Py_DECREF(s2); + Py_DECREF(s); + s = s3; + } +#else PyObject *s = PyString_FromString(""); for (i=0;ilen;i++) PyString_ConcatAndDel(&s,fortran_doc(fp->defs[i])); +#endif if (PyDict_SetItemString(fp->dict, name, s)) return NULL; return s; } if ((strcmp(name,"_cpointer")==0) && (fp->len==1)) { - PyObject *cobj = PyCObject_FromVoidPtr((void *)(fp->defs[0].data),NULL); + PyObject *cobj = F2PyCapsule_FromVoidPtr((void *)(fp->defs[0].data),NULL); if (PyDict_SetItemString(fp->dict, name, cobj)) return NULL; return cobj; } +#if PY_VERSION_HEX >= 0x03000000 + if (1) { + PyObject *str, *ret; + str = PyUnicode_FromString(name); + ret = PyObject_GenericGetAttr((PyObject *)fp, str); + Py_DECREF(str); + return ret; + } +#else return Py_FindMethod(fortran_methods, (PyObject *)fp, name); +#endif } static int @@ -322,10 +350,39 @@ fortran_call(PyFortranObject *fp, PyObject *arg, PyObject *kw) { return NULL; } +static PyObject * +fortran_repr(PyFortranObject *fp) +{ + PyObject *name = NULL, *repr = NULL; + name = PyObject_GetAttrString((PyObject *)fp, "__name__"); + PyErr_Clear(); +#if PY_VERSION_HEX >= 0x03000000 + if (name != NULL && PyUnicode_Check(name)) { + repr = PyUnicode_FromFormat("", name); + } + else { + repr = PyUnicode_FromString(""); + } +#else + if (name != NULL && PyString_Check(name)) { + repr = PyString_FromFormat("", PyString_AsString(name)); + } + else { + repr = PyString_FromString(""); + } +#endif + Py_XDECREF(name); + return repr; +} + PyTypeObject PyFortran_Type = { +#if PY_VERSION_HEX >= 0x03000000 + PyVarObject_HEAD_INIT(NULL, 0) +#else PyObject_HEAD_INIT(0) 0, /*ob_size*/ +#endif "fortran", /*tp_name*/ sizeof(PyFortranObject), /*tp_basicsize*/ 0, /*tp_itemsize*/ @@ -334,8 +391,8 @@ PyTypeObject PyFortran_Type = { 0, /*tp_print*/ (getattrfunc)fortran_getattr, /*tp_getattr*/ (setattrfunc)fortran_setattr, /*tp_setattr*/ - 0, /*tp_compare*/ - 0, /*tp_repr*/ + 0, /*tp_compare/tp_reserved*/ + (reprfunc)fortran_repr, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ 0, /*tp_as_mapping*/ diff --git a/numpy/f2py/src/fortranobject.h b/numpy/f2py/src/fortranobject.h index 696f79c94..54a386514 100644 --- a/numpy/f2py/src/fortranobject.h +++ b/numpy/f2py/src/fortranobject.h @@ -12,6 +12,31 @@ extern "C" { #define PY_ARRAY_UNIQUE_SYMBOL PyArray_API #include "numpy/arrayobject.h" +/* + * Python 3 support macros + */ +#if PY_VERSION_HEX >= 0x03000000 +#define PyString_Check PyBytes_Check +#define PyString_GET_SIZE PyBytes_GET_SIZE +#define PyString_AS_STRING PyBytes_AS_STRING +#define PyString_FromString PyBytes_FromString +#define PyString_ConcatAndDel PyBytes_ConcatAndDel +#define PyString_AsString PyBytes_AsString + +#define PyInt_Check PyLong_Check +#define PyInt_FromLong PyLong_FromLong +#define PyInt_AS_LONG PyLong_AsLong +#define PyInt_AsLong PyLong_AsLong + +#define PyNumber_Int PyNumber_Long +#endif + +#if (PY_VERSION_HEX < 0x02060000) +#define Py_TYPE(o) (((PyObject*)(o))->ob_type) +#define Py_REFCNT(o) (((PyObject*)(o))->ob_refcnt) +#define Py_SIZE(o) (((PyVarObject*)(o))->ob_size) +#endif + /* #ifdef F2PY_REPORT_ATEXIT_DISABLE #undef F2PY_REPORT_ATEXIT @@ -88,15 +113,15 @@ typedef struct { PyObject *dict; /* Fortran object attribute dictionary */ } PyFortranObject; -#define PyFortran_Check(op) ((op)->ob_type == &PyFortran_Type) -#define PyFortran_Check1(op) (0==strcmp((op)->ob_type->tp_name,"fortran")) +#define PyFortran_Check(op) (Py_TYPE(op) == &PyFortran_Type) +#define PyFortran_Check1(op) (0==strcmp(Py_TYPE(op)->tp_name,"fortran")) extern PyTypeObject PyFortran_Type; extern int F2PyDict_SetItemString(PyObject* dict, char *name, PyObject *obj); extern PyObject * PyFortranObject_New(FortranDataDef* defs, f2py_void_func init); extern PyObject * PyFortranObject_NewAsAttr(FortranDataDef* defs); -#if PY_VERSION_HEX >= 0X03010000 +#if PY_VERSION_HEX >= 0x03010000 PyObject * F2PyCapsule_FromVoidPtr(void *ptr, void (*dtor)(PyObject *)); void * F2PyCapsule_AsVoidPtr(PyObject *obj); @@ -146,6 +171,7 @@ int F2PyCapsule_Check(PyObject *ptr); extern void dump_attrs(const PyArrayObject* arr); #endif + #ifdef __cplusplus } #endif -- cgit v1.2.1