summaryrefslogtreecommitdiff
path: root/numpy/f2py
diff options
context:
space:
mode:
authorPearu Peterson <pearu.peterson@gmail.com>2011-05-06 01:30:03 +0300
committerPearu Peterson <pearu.peterson@gmail.com>2011-05-06 01:30:19 +0300
commitf393b6041c0d124b0372c494bab7de8dbe0cd422 (patch)
tree20adefd93eeb224f10ecdcb4b7b73487938bc312 /numpy/f2py
parent516d50cf42833c34ca617c2f09e0e779c6b93665 (diff)
downloadnumpy-f393b6041c0d124b0372c494bab7de8dbe0cd422.tar.gz
BUG: Fix assumed shape support for module routines.
Diffstat (limited to 'numpy/f2py')
-rw-r--r--numpy/f2py/f90mod_rules.py9
-rw-r--r--numpy/f2py/func2subr.py25
-rw-r--r--numpy/f2py/tests/src/assumed_shape/foo_mod.f9041
-rw-r--r--numpy/f2py/tests/test_assumed_shape.py7
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()