+ break;
+ }
+
+ return psi_ffi_token_type(real->type);
+}
+
+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 = pecalloc(s.argc + 1, sizeof(*s.els), 1);
+
+ info->rv_array = pecalloc(1, sizeof(ffi_type), 1);
+ 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);