flush
[m6w6/ext-psi] / src / module.c
index 3b4a643e2710986b92039992a167990dee058421..a883e62bd982dd721d405362166f691de90aad49 100644 (file)
@@ -332,10 +332,11 @@ void psi_to_array(zval *return_value, token_t t, impl_val *ret_val, decl_var *va
                ZEND_ASSERT(s);
                for (i = 0; i < s->args->count; ++i) {
                        decl_arg *darg = s->args->args[i];
-                       impl_val tmp;
+                       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) {
@@ -346,7 +347,7 @@ void psi_to_array(zval *return_value, token_t t, impl_val *ret_val, decl_var *va
                        case PSI_T_INT8:
                        case PSI_T_UINT8:
                                if (darg->var->pointer_level) {
-                                       psi_to_string(&ztmp, real_decl_type(darg->type)->type, &tmp, darg->var);
+                                       psi_to_string(&ztmp, real_decl_type(darg->type)->type, &tmp_ptr, darg->var);
                                        break;
                                }
                                /* no break */
@@ -358,6 +359,9 @@ void psi_to_array(zval *return_value, token_t t, impl_val *ret_val, decl_var *va
                        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();
@@ -543,9 +547,9 @@ void *psi_do_let(decl_arg *darg)
        }
 }
 
-void psi_do_set(zval *return_value, set_func *func, decl_vars *vars)
+void psi_do_set(zval *return_value, set_value *set)
 {
-       impl_val *val = (impl_val *) &vars->vars[0]->arg->let->ptr;
+       impl_val *val = (impl_val *) &set->vars->vars[0]->arg->let->ptr;
 
        ZVAL_DEREF(return_value);
        zval_dtor(return_value);
@@ -561,10 +565,8 @@ void psi_do_set(zval *return_value, set_func *func, decl_vars *vars)
        }
 }
 
-void psi_do_return(impl *impl, impl_val *ret_val, zval *return_value)
+void psi_do_return(return_stmt *ret, impl_val *ret_val, zval *return_value)
 {
-       return_stmt *ret = impl->stmts->ret.list[0];
-
        switch (ret->func->type) {
        case PSI_T_TO_STRING:
                psi_to_string(return_value, real_decl_type(impl->decl->func->type)->type, ret_val, ret->decl);