diff options
author | Pearu Peterson <pearu.peterson@gmail.com> | 2011-05-06 01:30:03 +0300 |
---|---|---|
committer | Pearu Peterson <pearu.peterson@gmail.com> | 2011-05-06 01:30:19 +0300 |
commit | f393b6041c0d124b0372c494bab7de8dbe0cd422 (patch) | |
tree | 20adefd93eeb224f10ecdcb4b7b73487938bc312 /numpy/f2py | |
parent | 516d50cf42833c34ca617c2f09e0e779c6b93665 (diff) | |
download | numpy-f393b6041c0d124b0372c494bab7de8dbe0cd422.tar.gz |
BUG: Fix assumed shape support for module routines.
Diffstat (limited to 'numpy/f2py')
-rw-r--r-- | numpy/f2py/f90mod_rules.py | 9 | ||||
-rw-r--r-- | numpy/f2py/func2subr.py | 25 | ||||
-rw-r--r-- | numpy/f2py/tests/src/assumed_shape/foo_mod.f90 | 41 | ||||
-rw-r--r-- | numpy/f2py/tests/test_assumed_shape.py | 7 |
4 files changed, 70 insertions, 12 deletions
diff --git a/numpy/f2py/f90mod_rules.py b/numpy/f2py/f90mod_rules.py index 6ce9b15ca..e4a4b0e96 100644 --- a/numpy/f2py/f90mod_rules.py +++ b/numpy/f2py/f90mod_rules.py @@ -180,8 +180,13 @@ def buildhooks(pymod): #efargs.append(fargs[-1]) ifargs.append(func2subr.createfuncwrapper(b,signature=1)) else: - fargs.append(b['name']) - mfargs.append(fargs[-1]) + if wrap: + fhooks[0]=fhooks[0]+wrap + fargs.append('f2pywrap_%s_%s'%(m['name'],b['name'])) + ifargs.append(func2subr.createsubrwrapper(b,signature=1)) + else: + fargs.append(b['name']) + mfargs.append(fargs[-1]) #if '--external-modroutines' in options and options['--external-modroutines']: # outmess('\t\t\tapplying --external-modroutines for %s\n'%(b['name'])) # efargs.append(fargs[-1]) diff --git a/numpy/f2py/func2subr.py b/numpy/f2py/func2subr.py index 4114cf831..0f76920ac 100644 --- a/numpy/f2py/func2subr.py +++ b/numpy/f2py/func2subr.py @@ -148,9 +148,13 @@ def createfuncwrapper(rout,signature=0): add(l) if need_interface: - add('interface') - add(rout['saved_interface'].lstrip()) - add('end interface') + if f90mode: + # f90 module already defines needed interface + pass + else: + add('interface') + add(rout['saved_interface'].lstrip()) + add('end interface') sargs = ', '.join([a for a in args if a not in extra_args]) @@ -185,7 +189,7 @@ def createsubrwrapper(rout,signature=0): v['dimension'][i] = dn rout['args'].extend(extra_args) need_interface = bool(extra_args) - + ret = [''] def add(line,ret=ret): ret[0] = '%s\n %s'%(ret[0],line) @@ -225,9 +229,13 @@ def createsubrwrapper(rout,signature=0): add(var2fixfortran(vars,a,f90mode=f90mode)) if need_interface: - add('interface') - add(rout['saved_interface'].lstrip()) - add('end interface') + if f90mode: + # f90 module already defines needed interface + pass + else: + add('interface') + add(rout['saved_interface'].lstrip()) + add('end interface') sargs = ', '.join([a for a in args if a not in extra_args]) @@ -266,8 +274,7 @@ def assubr(rout): break if flag: fvar['intent'].append('out=%s' % (rname)) - - rout['args'] = [fname] + rout['args'] + rout['args'][:] = [fname] + rout['args'] return rout,createfuncwrapper(rout) if issubroutine_wrap(rout): fortranname = getfortranname(rout) diff --git a/numpy/f2py/tests/src/assumed_shape/foo_mod.f90 b/numpy/f2py/tests/src/assumed_shape/foo_mod.f90 new file mode 100644 index 000000000..cbe6317ed --- /dev/null +++ b/numpy/f2py/tests/src/assumed_shape/foo_mod.f90 @@ -0,0 +1,41 @@ + +module mod + +contains + +subroutine sum(x, res) + implicit none + real, intent(in) :: x(:) + real, intent(out) :: res + + integer :: i + + !print *, "sum: size(x) = ", size(x) + + res = 0.0 + + do i = 1, size(x) + res = res + x(i) + enddo + +end subroutine sum + +function fsum(x) result (res) + implicit none + real, intent(in) :: x(:) + real :: res + + integer :: i + + !print *, "fsum: size(x) = ", size(x) + + res = 0.0 + + do i = 1, size(x) + res = res + x(i) + enddo + +end function fsum + + +end module mod diff --git a/numpy/f2py/tests/test_assumed_shape.py b/numpy/f2py/tests/test_assumed_shape.py index da362b760..e501b13c3 100644 --- a/numpy/f2py/tests/test_assumed_shape.py +++ b/numpy/f2py/tests/test_assumed_shape.py @@ -13,6 +13,7 @@ class TestAssumedShapeSumExample(util.F2PyTest): sources = [_path('src', 'assumed_shape', 'foo_free.f90'), _path('src', 'assumed_shape', 'foo_use.f90'), _path('src', 'assumed_shape', 'precision.f90'), + _path('src', 'assumed_shape', 'foo_mod.f90'), ] @dec.slow @@ -21,10 +22,14 @@ class TestAssumedShapeSumExample(util.F2PyTest): assert_(r==3,`r`) r = self.module.sum([1,2]) assert_(r==3,`r`) - r = self.module.sum_with_use([1,2]) assert_(r==3,`r`) + r = self.module.mod.sum([1,2]) + assert_(r==3,`r`) + r = self.module.mod.fsum([1,2]) + assert_(r==3,`r`) + if __name__ == "__main__": import nose nose.runmodule() |