88
99from .fVar import fVar
1010from .fVar_t import fVar_t
11+ from .utils import resolve_other_args
1112
1213_TEST_FLAG = os .environ .get ("_GFORT2PY_TEST_FLAG" ) is not None
1314
@@ -72,8 +73,6 @@ def name(self):
7273 return self .obj .name
7374
7475 def __call__ (self , * args , ** kwargs ):
75- self ._set_return ()
76-
7776 func_args = self ._convert_args (* args , ** kwargs )
7877
7978 with _captureStdOut () as cs :
@@ -84,13 +83,13 @@ def __call__(self, *args, **kwargs):
8483
8584 return self ._convert_result (res , func_args )
8685
87- def _set_return (self ):
86+ def _set_return (self , other_args ):
8887 if self .obj .is_subroutine ():
8988 self ._func .restype = None # Subroutine
9089 else :
91- if (
92- self . return_var . obj . is_char ()
93- ): # Returning a character is done as a character + len at start of arg list
90+ self . return_var . obj = resolve_other_args ( self . return_var . obj , other_args )
91+
92+ if self . return_var . obj . is_returned_as_arg ():
9493 self ._func .restype = None
9594 else :
9695 self ._func .restype = self .return_var .ctype ()
@@ -102,6 +101,9 @@ def args_start(self):
102101 l = self .return_var .len ()
103102 res .append (self .return_var .from_param (" " * l ))
104103 res .append (self .return_var .ctype_len ())
104+ elif self .return_var .obj .is_always_explicit () and self .obj .is_array ():
105+ empty_array = self .return_var ._make_empty ()
106+ res .append (ctypes .pointer (self .return_var .from_param (empty_array )))
105107
106108 return res
107109
@@ -145,10 +147,13 @@ def args_convert(self, input_args):
145147 return args , args_end
146148
147149 def _convert_args (self , * args , ** kwargs ):
148- args_start = self .args_start ()
149-
150150 self .input_args = self .args_check (* args , ** kwargs )
151151
152+ # Set this now after arsg_check as we need to be able to
153+ # resolve runtime arguments
154+ self ._set_return (self .input_args )
155+ args_start = self .args_start ()
156+
152157 args_mid , args_end = self .args_convert (self .input_args )
153158
154159 return args_start + args_mid + args_end
@@ -157,10 +162,14 @@ def _convert_result(self, result, args):
157162 res = {}
158163
159164 if self .obj .is_function ():
160- if self .return_var .obj .is_char ():
161- result = args [0 ]
162- _ = args .pop (0 )
163- _ = args .pop (0 ) # Twice to pop first and second value
165+ if self .return_var .obj .is_returned_as_arg ():
166+ if self .return_var .obj .is_char ():
167+ result = args [0 ]
168+ _ = args .pop (0 )
169+ _ = args .pop (0 ) # Twice to pop first and second value
170+ elif self .return_var .obj .is_always_explicit () and self .obj .is_array ():
171+ result = self .return_var .value
172+ _ = args .pop (0 )
164173
165174 if len (self .obj .args ()):
166175 for var in self .input_args :
0 commit comments