summaryrefslogtreecommitdiff
path: root/numpy/f2py/src/fortranobject.c
diff options
context:
space:
mode:
authorPauli Virtanen <pav@iki.fi>2010-03-06 23:59:08 +0000
committerPauli Virtanen <pav@iki.fi>2010-03-06 23:59:08 +0000
commit4c1ae336a15e4f701848fac12a521ba67bf784d3 (patch)
tree287c787e1a6e396f06cc2eb0a35b2472577d7328 /numpy/f2py/src/fortranobject.c
parent2fb79c1a20753baa824d2b2e6b0ad3f2b144db9d (diff)
downloadnumpy-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.c63
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*/