summaryrefslogtreecommitdiff
path: root/numpy/f2py/lib/py_wrap_subprogram.py
diff options
context:
space:
mode:
authorPearu Peterson <pearu.peterson@gmail.com>2006-10-11 11:25:58 +0000
committerPearu Peterson <pearu.peterson@gmail.com>2006-10-11 11:25:58 +0000
commitd6c1b18483f22c40abb5ae040476491b932ca6e0 (patch)
tree620cf0c5bab61e39076ae38694a4d87222d1a1ad /numpy/f2py/lib/py_wrap_subprogram.py
parent92a25379d95b1b1448f41e601e08ab0239ea7181 (diff)
downloadnumpy-d6c1b18483f22c40abb5ae040476491b932ca6e0.tar.gz
F2PY G3: Impl. scalar function support and tests.
Diffstat (limited to 'numpy/f2py/lib/py_wrap_subprogram.py')
-rw-r--r--numpy/f2py/lib/py_wrap_subprogram.py27
1 files changed, 20 insertions, 7 deletions
diff --git a/numpy/f2py/lib/py_wrap_subprogram.py b/numpy/f2py/lib/py_wrap_subprogram.py
index d8a99962c..012eac2a8 100644
--- a/numpy/f2py/lib/py_wrap_subprogram.py
+++ b/numpy/f2py/lib/py_wrap_subprogram.py
@@ -24,7 +24,7 @@ static char %(cname)s__doc[] = "";
'''
module_init_template = ''
module_method_template = '''\
-{"%(name)s", (PyCFunction)%(cname)s, METH_VARARGS | METH_KEYWORDS, %(cname)s__doc},'''
+{"%(pyname)s", (PyCFunction)%(cname)s, METH_VARARGS | METH_KEYWORDS, %(cname)s__doc},'''
c_code_template = ''
capi_code_template = '''\
static PyObject* %(cname)s(PyObject *capi_self, PyObject *capi_args, PyObject *capi_keywds) {
@@ -55,13 +55,16 @@ static PyObject* %(cname)s(PyObject *capi_self, PyObject *capi_args, PyObject *c
_defined = []
def __init__(self, parent, block):
WrapperBase.__init__(self)
- self.name = name = block.name
+ self.name = name = pyname = block.name
self.cname = cname = '%s_%s' % (parent.cname,name)
if cname in self._defined:
return
self._defined.append(cname)
self.info('Generating interface for %s: %s' % (block.__class__, cname))
+ if pyname.startswith('f2pywrap_'):
+ pyname = pyname[9:]
+ self.pyname = pyname
self.decl_list = []
self.kw_list = []
@@ -85,20 +88,30 @@ static PyObject* %(cname)s(PyObject *capi_self, PyObject *capi_args, PyObject *c
for argname in block.args:
argindex += 1
var = block.a.variables[argname]
+ assert var.is_scalar(),'array support not implemented: "%s"' % (var)
typedecl = var.get_typedecl()
PythonCAPIType(parent, typedecl)
ti = PyTypeInterface(typedecl)
- self.kw_list.append('"%s"' % (argname))
+ if var.is_intent_in():
+ self.kw_list.append('"%s"' % (argname))
if isinstance(typedecl, TypeStmt):
- self.pyarg_format_list.append('O&')
+ if var.is_intent_in():
+ self.pyarg_format_list.append('O&')
+ self.pyarg_obj_list.append('\npyobj_to_%s_inplace, &%s' % (ti.ctype, argname))
+ else:
+ self.frompyobj_list.append('%s = (%s*)pyobj_from_%s(NULL);' % (argname,ti.otype,ti.ctype))
+ if not var.is_intent_out():
+ self.clean_frompyobj_list.append('Py_DECREF(%s);' % (argname))
self.decl_list.append('%s* %s = NULL;' % (ti.otype, argname))
- self.pyarg_obj_list.append('\npyobj_to_%s_inplace, &%s' % (ti.ctype, argname))
args_f.append('%s->data' % (argname)) # is_scalar
else:
- self.pyarg_format_list.append('O&')
+ if var.is_intent_in():
+ self.pyarg_format_list.append('O&')
+ self.pyarg_obj_list.append('\npyobj_to_%s, &%s' % (ti.ctype, argname))
assert not isinstance(typedecl, TypeDecl)
if ti.ctype=='f2py_string0':
+ assert not var.is_intent_out(),'intent(out) not implemented for "%s"' % (var)
self.decl_list.append('%s %s = {NULL,0};' % (ti.ctype, argname))
args_f.append('%s.data' % argname) # is_scalar
extra_args_f.append('%s.len' % argname)
@@ -107,7 +120,7 @@ static PyObject* %(cname)s(PyObject *capi_self, PyObject *capi_args, PyObject *c
else:
self.decl_list.append('%s %s;' % (ti.ctype, argname))
args_f.append('&'+argname) # is_scalar
- self.pyarg_obj_list.append('\npyobj_to_%s, &%s' % (ti.ctype, argname))
+
if var.is_intent_out(): # and is_scalar
if isinstance(typedecl, TypeStmt):
self.return_format_list.append('N')