diff options
author | Pauli Virtanen <pav@iki.fi> | 2010-03-06 23:59:08 +0000 |
---|---|---|
committer | Pauli Virtanen <pav@iki.fi> | 2010-03-06 23:59:08 +0000 |
commit | 4c1ae336a15e4f701848fac12a521ba67bf784d3 (patch) | |
tree | 287c787e1a6e396f06cc2eb0a35b2472577d7328 /numpy/f2py/src/fortranobject.c | |
parent | 2fb79c1a20753baa824d2b2e6b0ad3f2b144db9d (diff) | |
download | numpy-4c1ae336a15e4f701848fac12a521ba67bf784d3.tar.gz |
3K: f2py: port much of f2py C code to Py3
Diffstat (limited to 'numpy/f2py/src/fortranobject.c')
-rw-r--r-- | numpy/f2py/src/fortranobject.c | 63 |
1 files changed, 60 insertions, 3 deletions
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;i<fp->len;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;i<fp->len;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("<fortran %U>", name); + } + else { + repr = PyUnicode_FromString("<fortran object>"); + } +#else + if (name != NULL && PyString_Check(name)) { + repr = PyString_FromFormat("<fortran %s>", PyString_AsString(name)); + } + else { + repr = PyString_FromString("<fortran object>"); + } +#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*/ |