diff options
author | Pearu Peterson <pearu.peterson@gmail.com> | 2006-10-11 11:25:58 +0000 |
---|---|---|
committer | Pearu Peterson <pearu.peterson@gmail.com> | 2006-10-11 11:25:58 +0000 |
commit | d6c1b18483f22c40abb5ae040476491b932ca6e0 (patch) | |
tree | 620cf0c5bab61e39076ae38694a4d87222d1a1ad /numpy/f2py/lib/py_wrap_subprogram.py | |
parent | 92a25379d95b1b1448f41e601e08ab0239ea7181 (diff) | |
download | numpy-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.py | 27 |
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') |