diff options
Diffstat (limited to 'numpy/f2py/lib/py_wrap_subprogram.py')
-rw-r--r-- | numpy/f2py/lib/py_wrap_subprogram.py | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/numpy/f2py/lib/py_wrap_subprogram.py b/numpy/f2py/lib/py_wrap_subprogram.py index 24bd07e1b..45ccad034 100644 --- a/numpy/f2py/lib/py_wrap_subprogram.py +++ b/numpy/f2py/lib/py_wrap_subprogram.py @@ -16,7 +16,7 @@ class PythonCAPISubProgram(WrapperBase): #define %(name)s_f F_FUNC(%(name)s, %(NAME)s) ''' extern_template_f77 = '''\ -extern void %(name)s_f(); +extern void %(name)s_f(%(ctype_args_f_clist)s); ''' objdecl_template_doc = '''\ static char %(cname)s__doc[] = ""; @@ -54,10 +54,11 @@ static PyObject* %(cname)s(PyObject *capi_self, PyObject *capi_args, PyObject *c #define %(init_func)s_f F_FUNC(%(init_func)s, %(INIT_FUNC)s) ''' typedef_template_module = ''' -typedef void (*%(name)s_functype)(); +typedef void (*%(name)s_functype)(%(ctype_args_f_clist)s); +typedef void (*%(init_func)s_c_functype)(%(name)s_functype); ''' extern_template_module = '''\ -extern void %(init_func)s_f( %(name)s_functype); +extern void %(init_func)s_f(%(init_func)s_c_functype); static %(name)s_functype %(name)s_func_ptr; ''' objdecl_template_module = ''' @@ -139,6 +140,8 @@ static void %(init_func)s_c(%(name)s_functype func_ptr) { args_f = [] extra_args_f = [] + ctype_args_f = [] + extra_ctype_args_f = [] argindex = -1 for argname in block.args: argindex += 1 @@ -160,6 +163,7 @@ static void %(init_func)s_c(%(name)s_functype func_ptr) { self.clean_frompyobj_list.append('Py_DECREF(%s);' % (argname)) self.decl_list.append('%s* %s = NULL;' % (ti.otype, argname)) args_f.append('%s->data' % (argname)) # is_scalar + ctype_args_f.append(ti.ctype) else: if var.is_intent_in(): self.pyarg_format_list.append('O&') @@ -170,13 +174,15 @@ static void %(init_func)s_c(%(name)s_functype func_ptr) { 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 + ctype_args_f.append('char*') + extra_ctype_args_f.append('int') extra_args_f.append('%s.len' % argname) self.clean_frompyobj_list.append(\ 'if (%s.len) free(%s.data);' % (argname,argname)) else: self.decl_list.append('%s %s;' % (ti.ctype, argname)) args_f.append('&'+argname) # is_scalar - + ctype_args_f.append(ti.ctype+'*') if var.is_intent_out(): # and is_scalar if isinstance(typedecl, TypeStmt): self.return_format_list.append('N') @@ -188,6 +194,11 @@ static void %(init_func)s_c(%(name)s_functype func_ptr) { self.call_list.append('%s_f(%s);' % (name,', '.join(args_f+extra_args_f))) + self.ctype_args_f_list = ctype_args_f + extra_ctype_args_f + if not self.ctype_args_f_list: + self.ctype_args_f_list.append('void') + + self.clean_pyobjfrom_list.reverse() self.clean_call_list.reverse() self.clean_frompyobj_list.reverse() |