- ret_val = deref_impl_val(0, ret_val, func);
- for (i = 0; i < func->var->array_size; ++i) {
- impl_val *ptr = iterate(ret_val, t, i, &tmp);
-
- switch (t) {
- case PSI_T_FLOAT:
- case PSI_T_DOUBLE:
- ZVAL_DOUBLE(&ele, ptr->dval);
- break;
- default:
- ZVAL_LONG(&ele, ptr->lval);
- break;
+
+ if (t == PSI_T_STRUCT) {
+ // decl_struct *s = real_decl_type(var->arg->type)->strct;
+
+ if (set->count) {
+ /* explicit member casts */
+ for (i = 0; i < set->count; ++i) {
+ set_value *sub_set = set->inner[i];
+ decl_var *sub_var = sub_set->vars->vars[0];
+
+ sub_set->outer.val = r_val;
+
+ if (sub_var->arg) {
+ impl_val *tmp = NULL, *val;
+ zval ztmp;
+
+ val = deref_impl_val(struct_member_ref(sub_var->arg, ret_val, &tmp), sub_var);
+ sub_set->func->handler(&ztmp, sub_set, val);
+ add_assoc_zval(return_value, sub_var->name, &ztmp);
+
+ if (tmp) {
+ free(tmp);
+ }
+ }
+ }
+ }
+ return;
+ }
+
+ if (var->arg->var->array_size) {
+ /* to_array(foo[NUMBER]) */
+ for (i = 0; i < var->arg->var->array_size; ++i) {
+ size_t size = psi_t_size(var->arg->var->pointer_level > 1 ? PSI_T_POINTER : t);
+ impl_val *ptr = iterate(ret_val, size, i, &tmp);
+ zval ele;
+
+ switch (t) {
+ case PSI_T_FLOAT:
+ ZVAL_DOUBLE(&ele, (double) ptr->fval);
+ break;
+ case PSI_T_DOUBLE:
+ ZVAL_DOUBLE(&ele, ptr->dval);
+ break;
+ default:
+ ZVAL_LONG(&ele, ptr->lval);
+ break;
+ }
+
+ add_next_index_zval(return_value, &ele);