@@ -682,29 +682,36 @@ def get_data_type(t):
682682 self .arg_type_formats = ""
683683 self .return_type = ""
684684 self .return_type_format = ""
685+ self .array_as_return_type = ()
685686 self .arg_types = {}
686687 counter = 1
687688 for t in types .keys ():
688689 if t == "return" :
689690 type = get_type_info (types [t ])
690- self .return_type_format = type [0 ]
691- self .return_type = type [1 ]
691+ if type [0 ] == 'O' :
692+ self .array_as_return_type = type
693+ continue
694+ else :
695+ self .return_type_format = type [0 ]
696+ self .return_type = type [1 ]
692697 else :
693698 type = get_type_info (types [t ])
694699 self .arg_type_formats += type [0 ]
695700 self .arg_types [counter ] = type [1 ]
696701 counter += 1
697702 # ----------------------------------------------------------------------
698- # `arg_0`: used as the return variables
703+ # `arg_0` is used as the return variable
699704 # arguments are declared as `arg_1`, `arg_2`, ...
700- variables_decl = ""
705+ variables_decl = "// Declare return variables and arguments \n "
701706 if self .return_type != "" :
702- variables_decl = "// Declare return variables and arguments\n "
703707 variables_decl += " " + get_data_type (self .return_type ) + "arg_" \
704708 + str (0 ) + ";\n "
709+ elif self .array_as_return_type :
710+ variables_decl += " " + get_data_type ( \
711+ self .array_as_return_type [1 ][1 ][:- 2 ]) + "arg_" + str (0 ) + ";\n "
705712 # ----------------------------------------------------------------------
706713 # `PyArray_AsCArray` is used to convert NumPy Arrays to C Arrays
707- # `fill_array_details` contains arrays operations to be
714+ # `fill_array_details` contains array operations to be
708715 # performed on the arguments
709716 # `parse_args` are used to capture the args from CPython
710717 # `pass_args` are the args that are passed to the shared library function
@@ -766,7 +773,24 @@ def get_data_type(t):
766773 // Build and return the result as a Python object
767774 return Py_BuildValue("{ self .return_type_format } ", arg_0);"""
768775 else :
769- fill_return_details = f"""{ self .fn_name } ({ pass_args } );
776+ if self .array_as_return_type :
777+ fill_return_details = f"""
778+ arg_0.data = malloc(sizeof({ self .array_as_return_type [1 ][2 ][:- 2 ]} ));
779+ arg_0.n_dims = 1;
780+ arg_0.dims[0].lower_bound = 0;
781+ arg_0.dims[0].length = arg_1;
782+ arg_0.is_allocated = false;
783+ { self .fn_name } ({ pass_args } , &arg_0);
784+
785+ // Build and return the result as a Python object
786+ PyObject* list_obj = PyList_New(arg_1);
787+ for (int i = 0; i < arg_1; i++) {{
788+ PyObject* element = PyFloat_FromDouble(arg_0.data[i]);
789+ PyList_SetItem(list_obj, i, element);
790+ }}
791+ return list_obj;"""
792+ else :
793+ fill_return_details = f"""{ self .fn_name } ({ pass_args } );
770794 Py_RETURN_NONE;"""
771795
772796 # ----------------------------------------------------------------------
@@ -856,4 +880,8 @@ def __call__(self, *args, **kwargs):
856880 # import the symbol from the shared library
857881 function = getattr (__import__ ("lpython_module_" + self .fn_name ),
858882 self .fn_name )
859- return function (* args , ** kwargs )
883+ if self .array_as_return_type :
884+ from numpy import array
885+ return array (function (* args , ** kwargs ))
886+ else :
887+ return function (* args , ** kwargs )
0 commit comments