diff options
author | Pearu Peterson <pearu.peterson@gmail.com> | 2006-10-05 07:23:48 +0000 |
---|---|---|
committer | Pearu Peterson <pearu.peterson@gmail.com> | 2006-10-05 07:23:48 +0000 |
commit | c6aa52df0532547ba1e046fbd65b8d0524e89c16 (patch) | |
tree | ca36e8e03e7077e71c3ecc34442d0e609ad36f89 /numpy | |
parent | 3a6607f4ccd87d54c8be6387cf6ee568e4bf77c0 (diff) | |
download | numpy-c6aa52df0532547ba1e046fbd65b8d0524e89c16.tar.gz |
F2PY G3: started subprogram support addition.
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/f2py/lib/main.py | 4 | ||||
-rw-r--r-- | numpy/f2py/lib/py_wrap.py | 311 | ||||
-rw-r--r-- | numpy/f2py/lib/py_wrap_subprogram.py | 23 | ||||
-rw-r--r-- | numpy/f2py/lib/py_wrap_type.py | 305 | ||||
-rw-r--r-- | numpy/f2py/lib/wrapper_base.py | 7 |
5 files changed, 340 insertions, 310 deletions
diff --git a/numpy/f2py/lib/main.py b/numpy/f2py/lib/main.py index c5b40cf35..1ede49171 100644 --- a/numpy/f2py/lib/main.py +++ b/numpy/f2py/lib/main.py @@ -266,7 +266,7 @@ def build_extension(sys_argv): extra_objects = extra_objects, ) if external_subprograms: - wrapper = PythonWrapper(modulename) + wrapper = PythonWrapperModule(modulename) for block in external_subprograms: wrapper.add(block) c_code = wrapper.c_code() @@ -301,7 +301,7 @@ def build_extension(sys_argv): new_sys_argv += ['config_fc'] + fc_flags sys.argv[:] = new_sys_argv - sys.stderr.write('setup arguments: %r' % (' '.join(sys.argv))) + sys.stderr.write('setup arguments: %r\n' % (' '.join(sys.argv))) from numpy.distutils.core import setup setup(configuration=configuration) diff --git a/numpy/f2py/lib/py_wrap.py b/numpy/f2py/lib/py_wrap.py index 788094085..f407e13f4 100644 --- a/numpy/f2py/lib/py_wrap.py +++ b/numpy/f2py/lib/py_wrap.py @@ -6,6 +6,8 @@ import sys from parser.api import * from wrapper_base import * +from py_wrap_type import * +from py_wrap_subprogram import * class PythonWrapperModule(WrapperBase): @@ -85,17 +87,13 @@ PyMODINIT_FUNC init%(modulename)s(void) { #for name, subblock in block.a.external_subprogram.items(): # self.add(subblock) elif isinstance(block, (Subroutine, Function)): - self.info('Generating interface for %s' % (block.name)) - f = PythonCAPIFunction(self, block) - f.fill() + PythonCAPISubProgram(self, block) elif isinstance(block, Module): for name,declblock in block.a.type_decls.items(): self.add(declblock) elif isinstance(block, TypeDecl): - self.info('Generating interface for %s' % (block.name)) PythonCAPIDerivedType(self, block) elif isinstance(block, tuple(declaration_type_spec)): - self.info('Generating interface for %s' % (block.name)) PythonCAPIIntrinsicType(self, block) else: raise NotImplementedError,`block.__class__.__name__` @@ -105,306 +103,3 @@ PyMODINIT_FUNC init%(modulename)s(void) { return self.apply_attributes(self.main_template) def fortran_code(self): return self.apply_attributes(self.main_fortran_template) - -class PythonCAPIIntrinsicType(WrapperBase): - """ - Fortran intrinsic type hooks. - """ - _defined_types = [] - def __init__(self, parent, typedecl): - WrapperBase.__init__(self) - self.name = name = typedecl.name - if name in self._defined_types: - return - self._defined_types.append(name) - - self.ctype = ctype = typedecl.get_c_type() - - if ctype.startswith('npy_'): - WrapperCCode(parent, 'pyobj_from_%s' % (ctype)) - return - - if not ctype.startswith('f2py_type_'): - raise NotImplementedError,`name,ctype` - - for n in parent.list_names: - l = getattr(parent,n + '_list') - l.append(self.apply_attributes(getattr(self, n+'_template',''))) - - return - -class PythonCAPIDerivedType(WrapperBase): - """ - Fortran 90 derived type hooks. - """ - - header_template = '''\ -#define %(oname)sObject_Check(obj) \\ - PyObject_TypeCheck((PyObject*)obj, &%(oname)sType) -#define %(init_func)s_f \\ - F_FUNC(%(init_func)s,%(INIT_FUNC)s) -''' - - typedef_template = '''\ -typedef void * %(ctype)s; -typedef struct { - PyObject_HEAD - %(ptrstruct_list)s - %(ctype)s data; -} %(oname)sObject; -''' - - extern_template = '''\ -static PyTypeObject %(oname)sType; -''' - - objdecl_template = '''\ -static PyMethodDef %(oname)s_methods[] = { - %(type_method_list)s - {NULL} /* Sentinel */ -}; - -static PyGetSetDef %(oname)s_getseters[] = { - %(type_getseters_list)s - {NULL} /* Sentinel */ -}; - -static PyTypeObject %(oname)sType = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "%(name)s", /*tp_name*/ - sizeof(%(oname)sObject), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)%(oname)s_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - %(oname)s_repr, /*tp_repr*/ - 0, /*tp_as_number*/ - 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ - 0, /*tp_hash */ - 0, /*tp_call*/ - 0, /*tp_str*/ - 0, /*tp_getattro*/ - 0, /*tp_setattro*/ - 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - "Fortran derived type %(name)s objects", /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - %(oname)s_methods, /* tp_methods */ - 0 /*%(oname)s_members*/, /* tp_members */ - %(oname)s_getseters, /* tp_getset */ - 0, /* tp_base */ - 0, /* tp_dict */ - 0, /* tp_descr_get */ - 0, /* tp_descr_set */ - 0, /* tp_dictoffset */ - (initproc)%(oname)s_init, /* tp_init */ - 0, /* tp_alloc */ - %(oname)s_new, /* tp_new */ -}; -''' - - module_init_template = '''\ -if (PyType_Ready(&%(oname)sType) < 0) - return; -PyModule_AddObject(f2py_module, "%(name)s", - (PyObject *)&%(oname)sType); -''' - - c_code_template = '''\ -static void %(init_func)s_c( - %(init_func_c_arg_clist)s) { - %(init_func_c_body_list)s -} -''' - - capi_code_template = '''\ -static void %(oname)s_dealloc(%(oname)sObject* self) { - if (self->data) - PyMem_Free(self->data); - self->ob_type->tp_free((PyObject*)self); -} - -static int pyobj_to_%(ctype)s(PyObject *obj, - %(ctype)s* value_ptr) { - int return_value = 0; -#if defined(F2PY_DEBUG_PYOBJ_TOFROM) - fprintf(stderr,"pyobj_to_%(ctype)s(type=%%s)\\n",PyString_AS_STRING(PyObject_Repr(PyObject_Type(obj)))); -#endif - if (%(oname)sObject_Check(obj)) { - if (!memcpy(value_ptr,((%(oname)sObject *)obj)->data, %(byte_size)s)) { - PyErr_SetString(PyExc_MemoryError, - "failed to copy %(name)s instance memory to %(ctype)s object."); - } else { - return_value = 1; - } - } -#if defined(F2PY_DEBUG_PYOBJ_TOFROM) - fprintf(stderr,"pyobj_to_%(ctype)s: return_value=%%d, PyErr_Occurred()=%%p\\n", return_value, PyErr_Occurred()); -#endif - return return_value; -} - -static PyObject* pyobj_from_%(ctype)s(%(ctype)s* value_ptr) { - %(oname)sObject* obj = (%(oname)sObject*)(%(oname)sType.tp_alloc(&%(oname)sType, 0)); - if (obj == NULL) - return NULL; - obj->data = PyMem_Malloc(%(byte_size)s); - if (obj->data == NULL) { - Py_DECREF(obj); - return PyErr_NoMemory(); - } - if (value_ptr) { - if (!memcpy(obj->data, value_ptr, %(byte_size)s)) { - PyErr_SetString(PyExc_MemoryError, - "failed to copy %(ctype)s object memory to %(name)s instance."); - } - } - %(init_func)s_f(%(init_func)s_c, obj, obj->data); - return (PyObject*)obj; -} - -static PyObject * %(oname)s_new(PyTypeObject *type, - PyObject *args, PyObject *kwds) -{ - return pyobj_from_%(ctype)s(NULL); -} - -static int %(oname)s_init(%(oname)sObject *self, - PyObject *capi_args, PyObject *capi_kwds) -{ - int return_value = 0; -#if defined(F2PY_DEBUG_PYOBJ_TOFROM) - fprintf(stderr,"%(oname)s_init()\\n"); -#endif - if (!PyArg_ParseTuple(capi_args,"%(attr_format_elist)s" - %(attr_init_clist)s)) - return_value = -1; -#if defined(F2PY_DEBUG_PYOBJ_TOFROM) - fprintf(stderr,"%(oname)s_init: return_value=%%d, PyErr_Occurred()=%%p\\n", return_value, PyErr_Occurred()); -#endif - return return_value; -} - -static PyObject * %(oname)s_as_tuple(%(oname)sObject * self) { - return Py_BuildValue("%(as_tuple_format_elist)s" - %(as_tuple_arg_clist)s); -} - -static PyObject * %(oname)s_repr(PyObject * self) { - PyObject* r = PyString_FromString("%(name)s("); - PyString_ConcatAndDel(&r, PyObject_Repr(%(oname)s_as_tuple((%(oname)sObject*)self))); - PyString_ConcatAndDel(&r, PyString_FromString(")")); - return r; -} - -%(getset_func_list)s -''' - - fortran_code_template = '''\ - subroutine %(init_func)s(init_func_c, self, obj) - %(use_stmt_list)s - external init_func_c -! self is %(oname)sObject - external self - %(ftype)s obj - call init_func_c(%(init_func_f_arg_clist)s) - end -''' - - #module_method_template = '''''' - - _defined_types = [] - def __init__(self, parent, typedecl): - WrapperBase.__init__(self) - name = typedecl.name - if name in self._defined_types: - return - self._defined_types.append(name) - - self.name = name - self.oname = oname = 'f2py_' + name - self.ctype = typedecl.get_c_type() - self.ctype_ptrs = self.ctype + '_ptrs' - self.ftype = typedecl.get_f_type() - self.byte_size = byte_size = typedecl.get_bit_size() / CHAR_BIT - WrapperCPPMacro(parent, 'F_FUNC') - - self.init_func_f_arg_list = ['self'] - self.init_func_c_arg_list = ['%sObject *self' % (self.oname)] - self.init_func_c_body_list = [] - self.ptrstruct_list = [] - self.attr_decl_list = [] - self.attr_format_list = [] - self.attr_init_list = [] - self.as_tuple_format_list = [] - self.as_tuple_arg_list = [] - self.getset_func_list = [] - self.type_getseters_list = [] - for n in typedecl.a.component_names: - v = typedecl.a.components[n] - t = v.get_typedecl() - ct = t.get_c_type() - on = 'f2py_' + t.name - parent.add(t) - self.ptrstruct_list.append('%s* %s_ptr;' % (ct, n)) - self.init_func_f_arg_list.append('obj %% %s' % (n)) - self.init_func_c_arg_list.append('\n%s * %s_ptr' % (ct, n)) - self.init_func_c_body_list.append('''\ -if (!((void*)%(n)s_ptr >= self->data - && (void*)%(n)s_ptr < self->data + %(byte_size)s )) - fprintf(stderr,"INCONSISTENCY IN %(name)s WRAPPER: " - "self->data=%%p <= %(n)s_ptr=%%p < self->data+%(byte_size)s=%%p\\n", - self->data, %(n)s_ptr, self->data + %(byte_size)s); -self->%(n)s_ptr = %(n)s_ptr; -''' % (locals())) - self.attr_format_list.append('O&') - WrapperCCode(parent, 'pyobj_to_%s' % (ct)) - self.attr_init_list.append('\npyobj_to_%s, self->%s_ptr' % (ct,n)) - WrapperCCode(parent, 'pyobj_from_%s' % (ct)) - self.as_tuple_format_list.append('O&') - self.as_tuple_arg_list.append('\npyobj_from_%s, self->%s_ptr' % (ct, n)) - self.getset_func_list.append('''\ -static PyObject * %(oname)s_get_%(n)s(%(oname)sObject *self, - void *closure) { - return pyobj_from_%(ct)s(self->%(n)s_ptr); -} -static int %(oname)s_set_%(n)s(%(oname)sObject *self, - PyObject *value, void *closure) -{ - if (value == NULL) { - PyErr_SetString(PyExc_TypeError, - "Cannot delete %(name)s attribute %(n)s"); - return -1; - } - if (pyobj_to_%(ct)s(value, self->%(n)s_ptr)) - return 0; - return -1; -} -''' % (locals())) - self.type_getseters_list.append('{"%(n)s",(getter)%(oname)s_get_%(n)s, (setter)%(oname)s_set_%(n)s,\n "component %(n)s",NULL},' % (locals())) - if self.attr_init_list: self.attr_init_list.insert(0,'') - if self.as_tuple_arg_list: self.as_tuple_arg_list.insert(0,'') - self.init_func = self.ctype + '_init' - self.INIT_FUNC = self.init_func.upper() - - self.type_method_list = [] - self.type_method_list.append('{"as_tuple",(PyCFunction)%(oname)s_as_tuple,METH_NOARGS,\n "Return %(name)s components as tuple."},' % (self.__dict__)) - self.cname = typedecl.get_c_name() - - self.use_stmt_list = [] - if isinstance(typedecl.parent, Module): - self.use_stmt_list.append('use %s' % (typedecl.parent.name)) - - for n in parent.list_names: - l = getattr(parent,n + '_list') - l.append(self.apply_attributes(getattr(self, n+'_template',''))) - return diff --git a/numpy/f2py/lib/py_wrap_subprogram.py b/numpy/f2py/lib/py_wrap_subprogram.py new file mode 100644 index 000000000..3c203c317 --- /dev/null +++ b/numpy/f2py/lib/py_wrap_subprogram.py @@ -0,0 +1,23 @@ + +__all__ = ['PythonCAPISubProgram'] + +import sys + +from wrapper_base import * + +class PythonCAPISubProgram(WrapperBase): + """ + Fortran subprogram hooks. + """ + _defined = [] + def __init__(self, parent, block): + WrapperBase.__init__(self) + self.name = name = block.name + if name in self._defined: + return + self._defined.append(name) + self.info('Generating interface for %s: %s' % (block.__class__, name)) + + + raise NotImplementedError,`name,block.__class__` + return diff --git a/numpy/f2py/lib/py_wrap_type.py b/numpy/f2py/lib/py_wrap_type.py new file mode 100644 index 000000000..6e28adcb3 --- /dev/null +++ b/numpy/f2py/lib/py_wrap_type.py @@ -0,0 +1,305 @@ + +__all__ = ['PythonCAPIIntrinsicType', 'PythonCAPIDerivedType'] + +from wrapper_base import * +from parser.api import CHAR_BIT, Module + +class PythonCAPIIntrinsicType(WrapperBase): + """ + Fortran intrinsic type hooks. + """ + _defined = [] + def __init__(self, parent, typedecl): + WrapperBase.__init__(self) + self.name = name = typedecl.name + if name in self._defined: + return + self._defined.append(name) + self.info('Generating interface for %s: %s' % (typedecl.__class__, name)) + + ctype = typedecl.get_c_type() + + if ctype.startswith('npy_'): + WrapperCCode(parent, 'pyobj_from_%s' % (ctype)) + return + + if not ctype.startswith('f2py_type_'): + raise NotImplementedError,`name,ctype` + return + +class PythonCAPIDerivedType(WrapperBase): + """ + Fortran 90 derived type hooks. + """ + + header_template = '''\ +#define %(oname)sObject_Check(obj) \\ + PyObject_TypeCheck((PyObject*)obj, &%(oname)sType) +#define %(init_func)s_f \\ + F_FUNC(%(init_func)s,%(INIT_FUNC)s) +''' + + typedef_template = '''\ +typedef void * %(ctype)s; +typedef struct { + PyObject_HEAD + %(ptrstruct_list)s + %(ctype)s data; +} %(oname)sObject; +''' + + extern_template = '''\ +static PyTypeObject %(oname)sType; +''' + + objdecl_template = '''\ +static PyMethodDef %(oname)s_methods[] = { + %(type_method_list)s + {NULL} /* Sentinel */ +}; + +static PyGetSetDef %(oname)s_getseters[] = { + %(type_getseters_list)s + {NULL} /* Sentinel */ +}; + +static PyTypeObject %(oname)sType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "%(name)s", /*tp_name*/ + sizeof(%(oname)sObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)%(oname)s_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + %(oname)s_repr, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + "Fortran derived type %(name)s objects", /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + %(oname)s_methods, /* tp_methods */ + 0 /*%(oname)s_members*/, /* tp_members */ + %(oname)s_getseters, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + (initproc)%(oname)s_init, /* tp_init */ + 0, /* tp_alloc */ + %(oname)s_new, /* tp_new */ +}; +''' + + module_init_template = '''\ +if (PyType_Ready(&%(oname)sType) < 0) + return; +PyModule_AddObject(f2py_module, "%(name)s", + (PyObject *)&%(oname)sType); +''' + + c_code_template = '''\ +static void %(init_func)s_c( + %(init_func_c_arg_clist)s) { + %(init_func_c_body_list)s +} +''' + + capi_code_template = '''\ +static void %(oname)s_dealloc(%(oname)sObject* self) { + if (self->data) + PyMem_Free(self->data); + self->ob_type->tp_free((PyObject*)self); +} + +static int pyobj_to_%(ctype)s(PyObject *obj, + %(ctype)s* value_ptr) { + int return_value = 0; +#if defined(F2PY_DEBUG_PYOBJ_TOFROM) + fprintf(stderr,"pyobj_to_%(ctype)s(type=%%s)\\n",PyString_AS_STRING(PyObject_Repr(PyObject_Type(obj)))); +#endif + if (%(oname)sObject_Check(obj)) { + if (!memcpy(value_ptr,((%(oname)sObject *)obj)->data, %(byte_size)s)) { + PyErr_SetString(PyExc_MemoryError, + "failed to copy %(name)s instance memory to %(ctype)s object."); + } else { + return_value = 1; + } + } +#if defined(F2PY_DEBUG_PYOBJ_TOFROM) + fprintf(stderr,"pyobj_to_%(ctype)s: return_value=%%d, PyErr_Occurred()=%%p\\n", return_value, PyErr_Occurred()); +#endif + return return_value; +} + +static PyObject* pyobj_from_%(ctype)s(%(ctype)s* value_ptr) { + %(oname)sObject* obj = (%(oname)sObject*)(%(oname)sType.tp_alloc(&%(oname)sType, 0)); + if (obj == NULL) + return NULL; + obj->data = PyMem_Malloc(%(byte_size)s); + if (obj->data == NULL) { + Py_DECREF(obj); + return PyErr_NoMemory(); + } + if (value_ptr) { + if (!memcpy(obj->data, value_ptr, %(byte_size)s)) { + PyErr_SetString(PyExc_MemoryError, + "failed to copy %(ctype)s object memory to %(name)s instance."); + } + } + %(init_func)s_f(%(init_func)s_c, obj, obj->data); + return (PyObject*)obj; +} + +static PyObject * %(oname)s_new(PyTypeObject *type, + PyObject *args, PyObject *kwds) +{ + return pyobj_from_%(ctype)s(NULL); +} + +static int %(oname)s_init(%(oname)sObject *self, + PyObject *capi_args, PyObject *capi_kwds) +{ + int return_value = 0; +#if defined(F2PY_DEBUG_PYOBJ_TOFROM) + fprintf(stderr,"%(oname)s_init()\\n"); +#endif + if (!PyArg_ParseTuple(capi_args,"%(attr_format_elist)s" + %(attr_init_clist)s)) + return_value = -1; +#if defined(F2PY_DEBUG_PYOBJ_TOFROM) + fprintf(stderr,"%(oname)s_init: return_value=%%d, PyErr_Occurred()=%%p\\n", return_value, PyErr_Occurred()); +#endif + return return_value; +} + +static PyObject * %(oname)s_as_tuple(%(oname)sObject * self) { + return Py_BuildValue("%(as_tuple_format_elist)s" + %(as_tuple_arg_clist)s); +} + +static PyObject * %(oname)s_repr(PyObject * self) { + PyObject* r = PyString_FromString("%(name)s("); + PyString_ConcatAndDel(&r, PyObject_Repr(%(oname)s_as_tuple((%(oname)sObject*)self))); + PyString_ConcatAndDel(&r, PyString_FromString(")")); + return r; +} + +%(getset_func_list)s +''' + + fortran_code_template = '''\ + subroutine %(init_func)s(init_func_c, self, obj) + %(use_stmt_list)s + external init_func_c +! self is %(oname)sObject + external self + %(ftype)s obj + call init_func_c(%(init_func_f_arg_clist)s) + end +''' + + #module_method_template = '''''' + + _defined = [] + def __init__(self, parent, typedecl): + WrapperBase.__init__(self) + name = typedecl.name + if name in self._defined: + return + self._defined.append(name) + self.info('Generating interface for %s: %s' % (typedecl.__class__, name)) + + self.name = name + self.oname = oname = 'f2py_' + name + self.ctype = typedecl.get_c_type() + self.ctype_ptrs = self.ctype + '_ptrs' + self.ftype = typedecl.get_f_type() + self.byte_size = byte_size = typedecl.get_bit_size() / CHAR_BIT + WrapperCPPMacro(parent, 'F_FUNC') + + self.init_func_f_arg_list = ['self'] + self.init_func_c_arg_list = ['%sObject *self' % (self.oname)] + self.init_func_c_body_list = [] + self.ptrstruct_list = [] + self.attr_decl_list = [] + self.attr_format_list = [] + self.attr_init_list = [] + self.as_tuple_format_list = [] + self.as_tuple_arg_list = [] + self.getset_func_list = [] + self.type_getseters_list = [] + for n in typedecl.a.component_names: + v = typedecl.a.components[n] + t = v.get_typedecl() + ct = t.get_c_type() + on = 'f2py_' + t.name + parent.add(t) + self.ptrstruct_list.append('%s* %s_ptr;' % (ct, n)) + self.init_func_f_arg_list.append('obj %% %s' % (n)) + self.init_func_c_arg_list.append('\n%s * %s_ptr' % (ct, n)) + self.init_func_c_body_list.append('''\ +if (!((void*)%(n)s_ptr >= self->data + && (void*)%(n)s_ptr < self->data + %(byte_size)s )) + fprintf(stderr,"INCONSISTENCY IN %(name)s WRAPPER: " + "self->data=%%p <= %(n)s_ptr=%%p < self->data+%(byte_size)s=%%p\\n", + self->data, %(n)s_ptr, self->data + %(byte_size)s); +self->%(n)s_ptr = %(n)s_ptr; +''' % (locals())) + self.attr_format_list.append('O&') + WrapperCCode(parent, 'pyobj_to_%s' % (ct)) + self.attr_init_list.append('\npyobj_to_%s, self->%s_ptr' % (ct,n)) + WrapperCCode(parent, 'pyobj_from_%s' % (ct)) + self.as_tuple_format_list.append('O&') + self.as_tuple_arg_list.append('\npyobj_from_%s, self->%s_ptr' % (ct, n)) + self.getset_func_list.append('''\ +static PyObject * %(oname)s_get_%(n)s(%(oname)sObject *self, + void *closure) { + return pyobj_from_%(ct)s(self->%(n)s_ptr); +} +static int %(oname)s_set_%(n)s(%(oname)sObject *self, + PyObject *value, void *closure) +{ + if (value == NULL) { + PyErr_SetString(PyExc_TypeError, + "Cannot delete %(name)s attribute %(n)s"); + return -1; + } + if (pyobj_to_%(ct)s(value, self->%(n)s_ptr)) + return 0; + return -1; +} +''' % (locals())) + self.type_getseters_list.append('{"%(n)s",(getter)%(oname)s_get_%(n)s, (setter)%(oname)s_set_%(n)s,\n "component %(n)s",NULL},' % (locals())) + if self.attr_init_list: self.attr_init_list.insert(0,'') + if self.as_tuple_arg_list: self.as_tuple_arg_list.insert(0,'') + self.init_func = self.ctype + '_init' + self.INIT_FUNC = self.init_func.upper() + + self.type_method_list = [] + self.type_method_list.append('{"as_tuple",(PyCFunction)%(oname)s_as_tuple,METH_NOARGS,\n "Return %(name)s components as tuple."},' % (self.__dict__)) + self.cname = typedecl.get_c_name() + + self.use_stmt_list = [] + if isinstance(typedecl.parent, Module): + self.use_stmt_list.append('use %s' % (typedecl.parent.name)) + + for n in parent.list_names: + l = getattr(parent,n + '_list') + l.append(self.apply_attributes(getattr(self, n+'_template',''))) + return diff --git a/numpy/f2py/lib/wrapper_base.py b/numpy/f2py/lib/wrapper_base.py index 234154142..7491d37f7 100644 --- a/numpy/f2py/lib/wrapper_base.py +++ b/numpy/f2py/lib/wrapper_base.py @@ -2,6 +2,7 @@ import os import sys import re + __all__ = ['WrapperBase','WrapperCPPMacro','WrapperCCode'] class WrapperBase: @@ -102,6 +103,12 @@ class WrapperBase: d[name] = str(attrs).replace('\n','\n'+tab) return template % d + def apply_templates(self, child): + for n in parent.list_names: + l = getattr(parent,n + '_list') + l.append(child.apply_attributes(getattr(child, n+'_template',''))) + return + class WrapperCPPMacro(WrapperBase): """ CPP macros |