struct retvals
[m6w6/ext-psi] / src / module.c
index 2257a0d9d68a5256f2758cc7a6d9c823a57a0600..5c8634ac5d9864f79b903191ea2f1a1135d3a258 100644 (file)
@@ -788,6 +788,10 @@ static inline void psi_do_clean(impl *impl)
 {
        size_t i;
 
+       if (impl->decl->func->ptr != &impl->decl->func->val) {
+               efree(impl->decl->func->ptr);
+               impl->decl->func->ptr = &impl->decl->func->val;
+       }
        for (i = 0; i < impl->func->args->count; ++i ) {
                impl_arg *iarg = impl->func->args->args[i];
 
@@ -1068,6 +1072,16 @@ static inline void psi_do_args(impl *impl) {
        for (i = 0; i < impl->decl->args->count; ++i) {
                impl->decl->call.args[i] = impl->decl->args->args[i]->let->ptr;
        }
+
+       if (!impl->decl->func->var->pointer_level) {
+               decl_type *real = real_decl_type(impl->decl->func->type);
+
+               switch (real->type) {
+               case PSI_T_STRUCT:
+                       impl->decl->func->ptr = psi_array_to_struct(real->strct, NULL);
+                       break;
+               }
+       }
 }
 
 static inline impl_vararg *psi_do_varargs(impl *impl) {