X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Ftypes%2Fset_exp.c;h=e19e79dff7813cbbbcbac22e055276572c41c557;hp=ac55c3ad4bcc3a0282196cc825b76fc9eecf2bca;hb=c9384515a81cb64d345b299908b2852f51bb8e6e;hpb=9bcb1df0786a8193d65949c857baaba2f4296e84 diff --git a/src/types/set_exp.c b/src/types/set_exp.c index ac55c3a..e19e79d 100644 --- a/src/types/set_exp.c +++ b/src/types/set_exp.c @@ -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;