+
+static inline ffi_type *psi_ffi_decl_func_array_type(struct psi_decl *fn) {
+ struct psi_ffi_decl_info *info = fn->info;
+ struct psi_ffi_struct_element_storage s = {0};
+ struct psi_layout l;
+ ffi_type *type;
+ size_t i;
+
+ if (info->rv_array) {
+ return info->rv_array;
+ }
+
+ s.last_arg_pos = -1;
+ s.argc = fn->func->var->array_size;
+ s.els = calloc(s.argc + 1, sizeof(*s.els));
+
+ info->rv_array = calloc(1, sizeof(ffi_type));
+ info->rv_array->type = FFI_TYPE_STRUCT;
+ info->rv_array->size = 0;
+ info->rv_array->elements = s.els;
+
+ l.pos = 0;
+ if (fn->func->var->pointer_level > 1) {
+ l.len = SIZEOF_VOID_P;
+ type = &ffi_type_pointer;
+ } else {
+ l.len = psi_decl_type_get_size(fn->func->type, NULL);
+ type = psi_ffi_decl_type(fn->func->type);
+ }
+
+ assert(!fn->func->layout);
+ fn->func->layout = &l;
+ for (i = 0; i < fn->func->var->array_size; ++i) {
+ psi_ffi_struct_type_element(&s, fn->func, type);
+ info->rv_array->elements = s.els;
+ l.pos += l.len;
+ }
+ fn->func->layout = NULL;
+
+ return info->rv_array;
+}
+