+
+ if (t == PSI_T_STRUCT) {
+ decl_struct *s = real_decl_type(var->arg->type)->strct;
+ ret_val = deref_impl_val(ret_val, var);
+
+ ZEND_ASSERT(s);
+ for (i = 0; i < s->args->count; ++i) {
+ decl_arg *darg = s->args->args[i];
+ impl_val tmp, tmp_ptr;
+ zval ztmp;
+ char *ptr = (char *) ret_val->ptr + darg->layout->pos;
+
+ tmp_ptr.ptr = &tmp;
+ memset(&tmp, 0, sizeof(tmp));
+ memcpy(&tmp, ptr, darg->layout->len);
+ switch (real_decl_type(darg->type)->type) {
+ case PSI_T_FLOAT:
+ case PSI_T_DOUBLE:
+ psi_to_double(&ztmp, real_decl_type(darg->type)->type, &tmp, darg->var);
+ break;
+ case PSI_T_INT8:
+ case PSI_T_UINT8:
+ if (darg->var->pointer_level) {
+ psi_to_string(&ztmp, real_decl_type(darg->type)->type, &tmp_ptr, darg->var);
+ break;
+ }
+ /* no break */
+ case PSI_T_INT16:
+ case PSI_T_UINT16:
+ case PSI_T_INT32:
+ case PSI_T_UINT32:
+ case PSI_T_INT64:
+ case PSI_T_UINT64:
+ psi_to_int(&ztmp, real_decl_type(darg->type)->type, &tmp, darg->var);
+ break;
+ case PSI_T_STRUCT:
+ psi_to_array(&ztmp, real_decl_type(darg->type)->type, &tmp_ptr, darg->var);
+ break;
+ default:
+ printf("t=%d\n", real_decl_type(darg->type)->type);
+ abort();
+ }
+ add_assoc_zval(return_value, darg->var->name, &ztmp);
+ }
+ return;
+ }
+ ret_val = deref_impl_val(ret_val, var);
+ for (i = 0; i < var->arg->var->array_size; ++i) {