+
+ 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);
+
+ if (set->count) {
+ /* explicit member casts */
+ for (i = 0; i < set->count; ++i) {
+ zval ztmp;
+ impl_val *tmp_ptr;
+ set_value *sub_set = set->inner[i];
+ decl_var *sub_var = sub_set->vars->vars[0];
+ decl_arg *sub_arg = sub_var->arg;
+
+ if (sub_arg) {
+ token_t t = real_decl_type(sub_arg->type)->type;
+ void *ptr = malloc(sub_arg->layout->len);
+
+ memcpy(ptr, (char *) ret_val->ptr + sub_arg->layout->pos,
+ sub_arg->layout->len);
+ tmp_ptr = enref_impl_val(ptr, sub_arg->var);
+ sub_set->func->handler(&ztmp, t, tmp_ptr, sub_set, sub_var);
+ add_assoc_zval(return_value, sub_var->name, &ztmp);
+ free(tmp_ptr);
+ if (tmp_ptr != ptr) {
+ free(ptr);
+ }
+ }
+ }
+ }
+ return;
+
+// 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) {