flush
[m6w6/ext-psi] / src / module.c
index 3b4a643e2710986b92039992a167990dee058421..eec8611178bc4189d3129fd50a36aff86a793ff1 100644 (file)
@@ -93,6 +93,24 @@ size_t psi_num_min_args(impl *impl)
        return n;
 }
 
+void psi_to_bool(zval *return_value, token_t t, impl_val *ret_val, decl_var *var)
+{
+       switch (t) {
+       case PSI_T_FLOAT:
+               RETVAL_DOUBLE((double) deref_impl_val(ret_val, var)->fval);
+               convert_to_boolean(return_value);
+               break;
+       case PSI_T_DOUBLE:
+               RETVAL_DOUBLE(deref_impl_val(ret_val, var)->dval);
+               convert_to_boolean(return_value);
+               break;
+       default:
+               RETVAL_LONG(deref_impl_val(ret_val, var)->lval);
+               convert_to_boolean(return_value);
+               break;
+       }
+}
+
 void psi_to_int(zval *return_value, token_t t, impl_val *ret_val, decl_var *var)
 {
        switch (t) {
@@ -332,10 +350,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 +365,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 +377,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,40 +565,22 @@ 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;
+       token_t t = real_decl_type(set->vars->vars[0]->arg->type)->type;
 
        ZVAL_DEREF(return_value);
        zval_dtor(return_value);
 
-       switch (func->type) {
-       case PSI_T_TO_STRING:
-               psi_to_string(return_value, real_decl_type(vars->vars[0]->arg->type)->type, val, vars->vars[0]);
-               break;
-       case PSI_T_TO_ARRAY:
-               psi_to_array(return_value, real_decl_type(vars->vars[0]->arg->type)->type, val, vars->vars[0]);
-               break;
-       EMPTY_SWITCH_DEFAULT_CASE();
-       }
+       set->func->handler(return_value, t, val, set->vars->vars[0]);
 }
 
-void psi_do_return(impl *impl, impl_val *ret_val, zval *return_value)
+void psi_do_return(zval *return_value, return_stmt *ret, impl_val *ret_val)
 {
-       return_stmt *ret = impl->stmts->ret.list[0];
+       token_t t = real_decl_type(ret->decl->type)->type;
 
-       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);
-               break;
-       case PSI_T_TO_INT:
-               psi_to_int(return_value, real_decl_type(impl->decl->func->type)->type, ret_val, ret->decl);
-               break;
-       case PSI_T_TO_ARRAY:
-               psi_to_array(return_value, real_decl_type(impl->decl->func->type)->type, ret_val, ret->decl);
-               break;
-       EMPTY_SWITCH_DEFAULT_CASE();
-       }
+       ret->set->func->handler(return_value, t, ret_val, ret->decl->var);
 }
 
 void psi_do_free(free_stmt *fre)