#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)
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);
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);
}
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;
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;