Merge branch 'slimconfigure'
[m6w6/ext-psi] / src / types / set_exp.c
index ac55c3ad4bcc3a0282196cc825b76fc9eecf2bca..e19e79dff7813cbbbcbac22e055276572c41c557 100644 (file)
@@ -26,6 +26,7 @@
 #include "php_psi_stdinc.h"
 #include "data.h"
 #include "call.h"
+#include "calc.h"
 #include "marshal.h"
 
 struct psi_set_exp *psi_set_exp_init(enum psi_set_exp_kind kind, void *data)
@@ -49,7 +50,7 @@ struct psi_set_exp *psi_set_exp_init(enum psi_set_exp_kind kind, void *data)
 
 void psi_set_exp_exec(struct psi_set_exp *val, struct psi_call_frame *frame)
 {
-       struct psi_call_frame_symbol *frame_sym = NULL;
+       struct psi_call_frame_symbol *frame_sym;
        struct psi_call_frame_argument *frame_arg;
        struct psi_decl_var *set_dvar = psi_set_exp_get_decl_var(val);
        struct psi_impl_var *set_ivar = psi_set_exp_get_impl_var(val);
@@ -74,8 +75,16 @@ void psi_set_exp_exec_ex(struct psi_set_exp *val, zval *zv, impl_val *iv,
                val->data.func->handler(zv, val, iv, frame);
                break;
        case PSI_SET_NUMEXP:
-               psi_num_exp_exec(val->data.num, iv, frame);
-               psi_set_to_int(zv, val, iv, frame);
+               switch (psi_num_exp_exec(val->data.num, iv, frame, NULL)) {
+               case PSI_T_FLOAT:
+               case PSI_T_DOUBLE:
+               case PSI_T_LONG_DOUBLE:
+                       psi_set_to_float(zv, val, iv, frame);
+                       break;
+               default:
+                       psi_set_to_int(zv, val, iv, frame);
+                       break;
+               }
                break;
        default:
                assert(0);
@@ -175,11 +184,11 @@ struct psi_impl_var *psi_set_exp_get_impl_var(struct psi_set_exp *exp)
 }
 
 bool psi_set_exp_validate(struct psi_data *data, struct psi_set_exp *set,
-               struct psi_impl *impl, struct psi_decl *cb_decl)
+               struct psi_validate_scope *scope)
 {
        struct psi_impl_var *ivar = psi_set_exp_get_impl_var(set);
 
-       if (ivar && !psi_impl_var_validate(data, ivar, impl, NULL, set)) {
+       if (ivar && !psi_impl_var_validate(data, ivar, scope)) {
                data->error(data, ivar->token ? : **(struct psi_token ***) &set->data,
                                PSI_WARNING, "Unknown variable '%s'", ivar->name);
                return false;
@@ -187,12 +196,12 @@ bool psi_set_exp_validate(struct psi_data *data, struct psi_set_exp *set,
 
        switch (set->kind) {
        case PSI_SET_NUMEXP:
-               if (!psi_num_exp_validate(data, set->data.num, impl, cb_decl, NULL, set, NULL)) {
+               if (!psi_num_exp_validate(data, set->data.num, scope)) {
                        return false;
                }
                break;
        case PSI_SET_FUNC:
-               if (!psi_set_func_validate(data, set->data.func, set, impl, cb_decl)) {
+               if (!psi_set_func_validate(data, set->data.func, scope)) {
                        return false;
                }
                break;