X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Fmodule.c;h=eec8611178bc4189d3129fd50a36aff86a793ff1;hp=a883e62bd982dd721d405362166f691de90aad49;hb=e32a2cebb5fef59de8c202fc2ff936b51945744a;hpb=d9a7378b795f32b91e110bd163c019aa30e79084 diff --git a/src/module.c b/src/module.c index a883e62..eec8611 100644 --- a/src/module.c +++ b/src/module.c @@ -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) { @@ -550,35 +568,19 @@ void *psi_do_let(decl_arg *darg) void psi_do_set(zval *return_value, set_value *set) { 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(return_stmt *ret, impl_val *ret_val, zval *return_value) +void psi_do_return(zval *return_value, return_stmt *ret, impl_val *ret_val) { - 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(); - } + token_t t = real_decl_type(ret->decl->type)->type; + + ret->set->func->handler(return_value, t, ret_val, ret->decl->var); } void psi_do_free(free_stmt *fre)